poj 3259

刚开始是用的邻接矩阵,一直wa,后来看了其他人的代码,又想了想,两个点之间有多条路径,不能只存储权值最小的,因为每个路径都可能是一个最短路的组成部分(但现在还不是想的太清楚),所以有多少条边,就存多少边的信息bellman-ford

#include <iostream>
using namespace std;
const int maxn=501;
const int inf=2<<20;
int d[maxn],w[maxn*maxn],u[maxn*maxn],v[maxn*maxn];
int f,n,m,wm,t; 
bool bellman()
{
	int i,j;
	for(i=1;i<=n;i++)
		d[i]=inf;
	d[1]=0;
	for(i=1;i<n;i++)
	{
		for(j=1;j<=t;j++)
		{
			if(d[v[j]]>(d[u[j]]+w[j]))
				d[v[j]]=d[u[j]]+w[j];
		}
	}
	for(i=1;i<=t;i++)
	{
		if(d[v[i]]>(d[u[i]]+w[i]))
			return true;
	}
	return false;
}
int main()
{
	cin>>f;
	while(f--)
	{
		cin>>n>>m>>wm;
		int i;
		int tu,tv,tw;
		t=0;
		for(i=1;i<=m;i++)
		{
			cin>>tu>>tv>>tw;
			t++;
			u[t]=tu;v[t]=tv;w[t]=tw;
			t++;
			u[t]=tv;v[t]=tu;w[t]=tw;
		}
		for(i=1;i<=wm;i++)
		{
			cin>>tu>>tv>>tw;
			t++;
			u[t]=tu;v[t]=tv;w[t]=-tw;
		}
		bool flag=bellman();
		if(flag) cout<<"YES"<<endl;
		else cout<<"NO"<<endl;
	}
	return 0;
}


 

原文地址:https://www.cnblogs.com/lj030/p/3002343.html