如果把spfa函数里的memset换成for(55行)就会WA,为什么啊,
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
const int N = 2010, M = 6010, INF=0x3f;
typedef struct EdgeNode{
int to, val, next;
}Edge;
Edge edge[M];
int vis[N], dis[N],head[N],cnt[N],EdgeNum = 0;
queue<int> Q;
void insert(int from, int to, int val);
bool spfa(int n);
void init();
int main()
{
int t, n, m;
cin >> t;
while (t--)
{
init();
cin >> n >> m ;
for (int i = 0; i < m; i++)
{
int u, v,len;
cin >> u >> v >> len;
if (len >= 0)
insert(v, u, len);
insert(u, v, len);
}
if (!spfa(n))
cout << "YES" << endl;
else
cout << "NO"<<endl;
}
return 0;
}
void insert(int from, int to, int val)
{
edge[++EdgeNum].val = val;
edge[EdgeNum].to = to;
edge[EdgeNum].next = head[from];
head[from] = EdgeNum;
}
bool spfa(int n)
{
memset(dis, 0x3f, sizeof(dis));
for (int i = 0; i < N; i++)
{
vis[i] = 0;
cnt[i] = 0;
}
Q.push(1); dis[1] = 0; vis[1] = 1;
while (!Q.empty())
{
int x = Q.front();
Q.pop(); vis[x] = 0;
for (int i = head[x]; i; i = edge[i].next)
{
int y = edge[i].to, d = edge[i].val;
if (dis[y] > dis[x] + d)
{
dis[y] = dis[x] + d;
cnt[y]=cnt[x]+1;
if (cnt[y] >= n)
return false;
if (!vis[y])
{
vis[y] = 1;
Q.push(y);
}
}
}
}
return true;
}
void init()
{
for (int i = 0; i < N; i++)
head[i] = 0;
for (int i = 0; i < M; i++)
edge[i].next = 0;
EdgeNum = 0;
}