100->28pts,原因竟是》。。。。
查看原帖
100->28pts,原因竟是》。。。。
361035
graspppp楼主2022/8/16 22:06

每次用完队列和vector都得清零!!!!


调一个晚上,血的教训,警示后人

如果是前向星的话,得把head也清零!!

#include<bits/stdc++.h>//血的教训,调一个晚上,vector和队列都得清零!!! 
#define maxn 100500 
using namespace std; 
struct edge
{
	int v,w;
};
vector<edge> e[maxn];
int n,m,dis[maxn],vis[maxn],cnt[maxn];
queue<int> q;
bool spfa(int s)
{
	for(int i = 1;i <= n ;i++)
	{
		dis[i] = INT_MAX,vis[i] = 0,cnt[i] = 0;
	}
	dis[s] = 0;
	vis[s] = 1;
	cnt[s] = 1;
	q.push(s);
	while(!q.empty())
	{
		int u = q.front();
		q.pop();
		vis[u] = 0;
		for(int j = 0 ;j < e[u].size();j++)
		{
			edge ed = e[u][j];
			int v=ed.v,w=ed.w;
			if(dis[v] > dis[u] + w)
			{
				dis[v] = dis[u] + w;
				if(!vis[v])
				{
					cnt[v]++;
					vis[v] = 1;
					q.push(v); 
					if(cnt[v] > n)
					{
						cout<<"YES"<<endl;
						return true;
					}
				}
			}
		}
	}
	cout<<"NO"<<endl;
	return false;
}
int main()
{
	std::ios::sync_with_stdio(false);
	int T;
	cin>>T;
	while(T--)
	{
		cin>>n>>m;
		for(int i = 1;i <= m;i++)
		{
			int u;
			edge l;
			cin>>u>>l.v>>l.w;
			e[u].push_back(l);
			int a=l.v,b=l.w;
			if(b>=0)
			{
				e[a].push_back({u,b});
			}	
		}
		spfa(1);
		for(int j = 1;j <=n ;j++)	e[j].clear();//血的教训,调一个晚上,vector和队列都得清零!!! 
		while(!q.empty())	q.pop();//
	}
	return 0;
}

2022/8/16 22:06
加载中...