RT,这题我在建超级源点的时候将
add(n + 1, i, 0);
打成了
add(n + 1, n, 0);
但是提交之后居然过了
以下是AC代码
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
struct edge{
int from;
int to;
int nxt;
int q;
}e[20001];
int n, m, u, v, a, b, k, flag, head[5010], cnt, dis[5010], ls[5010];
void add(int uu, int vv, int ww)
{
e[++cnt].from = uu;
e[cnt].to = vv;
e[cnt].nxt = head[uu];
e[cnt].q = ww;
}
int main()
{
cin >> n >> m;
for(int i = 1; i <= m; i++)
{
cin >> a >> b >> k;
add(b, a, k);
}
dis[n + 1] = 0;
for(int i = 1; i <= n; i++)
{
add(n + 1, n, 0);
dis[i] = 999999999;
}
for(int xxx = 1; xxx <= n + 1; xxx++)
{
for(int i = 1; i <= cnt; i++)
if(dis[e[i].from] + e[i].q < dis[e[i].to])
ls[e[i].to] = dis[e[i].from] + e[i].q;
for(int i = 1; i <= n + 1; i++)
{
if(xxx == n + 1 && dis[i] != ls[i])
{
flag = 1;
break;
}
dis[i] = ls[i];
}
}
if(flag)
cout << "NO";
else
{
for(int i = 1; i <= n; i++)
cout << dis[i] << ' ';
}
return 0;
}