求助,有关memset
查看原帖
求助,有关memset
265813
有毒的牛肉干楼主2020/11/8 14:06

如果把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;
}



2020/11/8 14:06
加载中...