社区讨论
求助,WA60
P3106[USACO14OPEN] Dueling GPSs S参与者 3已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mi7ri5hq
- 此快照首次捕获于
- 2025/11/21 02:25 4 个月前
- 此快照最后确认于
- 2025/11/21 02:25 4 个月前
样例都没有过,输出2......
我建的确实是有向图......
CPP#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#define SIZE 100010
using namespace std;
struct node
{
int to, dis[3];
};
vector<node> graph[SIZE];
int id[SIZE], dis[SIZE], pre[SIZE], n;
bool inqueue[SIZE];
int spfa(int x)
{
queue<int> q;
int u, v, w, i;
q.push(1);
memset(dis, 63, sizeof (dis));
dis[1] = 0;
while (!q.empty())
{
u = q.front();
q.pop();
inqueue[u] = false;
for (i = 0; i < graph[u].size(); ++i)
{
v = graph[u][i].to;
w = graph[u][i].dis[x];
if (dis[u] + w < dis[v])
{
// printf("^%d %d\n", u, v);
dis[v] = dis[u] + w;
id[v] = i;
pre[v] = u;
if (!inqueue[v])
{
inqueue[v] = true;
q.push(v);
}
}
}
}
for (int k = 1; k <= n; ++k)
{
// printf("%d ", dis[k]);
}
// printf("###\n");
return dis[n];
}
void doit(void)
{
int u = n;
while (u != 1)
{
// printf("& %d %d\n", u, pre[u]);
--graph[pre[u]][id[u]].dis[2];
u = pre[u];
}
return;
}
int main(void)
{
int m, u, v, p, q;
scanf("%d%d", &n, &m);
while (m--)
{
scanf("%d%d%d%d", &u, &v, &p, &q);
graph[u].push_back({v, {p, q, 2}});
}
spfa(0);
doit();
spfa(1);
doit();
printf("%d", spfa(2));
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...