虫洞问题(判负环)

Bellman—Ford算法

for(int i=1;i     for(int j=0;j         if(dis[v[i]]             dis[v[i]]=dis[u[i]]+cost;
     

 题目:Click

#include
#include
#include
using namespace std;

struct edge{
	int from;
	int to;
	int cost;
};     //按边存储

const int MAX_E=2801;
edge e[MAX_E*2];

bool negtive_circle(){
	int N,M,W;
	cin>>N>>M>>W;
	int a,b,c;
	int i=0;
	//	存图 
	for(i=0;i>a>>b>>c;
		e[2*i].from=a;
		e[2*i].to=b;
		e[2*i].cost=c;
		
		e[2*i+1].from=b;
		e[2*i+1].to=a;
		e[2*i+1].cost=c; 
	}
	int j=i*2;
	for(int k=0;k>a>>b>>c;
		e[j].from=a;
		e[j].to=b;
		e[j].cost=-c; 
	}
	//判断 
	int s=e[0].from;    //初始化边为0
	int E=j;
	vector d(N+1,INT_MAX);//大小为n+1的数组,每个值赋为 INT_MAX
	d[s]=0;
	for(int v=0;vd[ee.from]+ee.cost){
				d[ee.to]=d[ee.from]+ee.cost;
				if(v==N-1) return true;	
			}
		}
	} 
	return false;
}

int main(){
	int f;
	cin>>f;
	while(f--){
		bool res=negtive_circle();
		if(res) cout<<"YES"<

 

你可能感兴趣的:(最短路径)