(Bellman-ford/SPFA)poj3259 Wormholes

传送门:poj3259 Wormholes

1.Bellman-ford

//poj3259
#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
#include<cstring>
#include<cstdio>
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=510;
int F,M,N,W;

struct Edge{
	int s,e,w;
	Edge(int s_,int e_,int w_):s(s_),e(e_),w(w_){}
	Edge(){}
};

vector<Edge> edges;  //所有边
int dist[maxn];

bool Bellman_ford(int v){
	memset(dist,INF,sizeof(dist));
	dist[v]=0;
	for(int k=1;k<N;k++){
		for(int i=0;i<edges.size();i++){
			int s=edges[i].s;
			int e=edges[i].e;
			if(dist[s]+edges[i].w<dist[e]) 
				dist[e]=dist[s]+edges[i].w;
		}
	}
	
	for(int i=0;i<edges.size();i++){
		int s=edges[i].s;
		int e=edges[i].e;
		if(dist[s]+edges[i].w<dist[e]) 
			return true;
	}
	return false;
} 

int main(){
	cin>>F;
	while(F--){
		edges.clear();
		cin>>N>>M>>W;
		for(int i=0;i<M;i++){
			int s,e,t;
			cin>>s>>e>>t;
			edges.push_back(Edge(s,e,t));
			edges.push_back(Edge(e,s,t));
		}
		for(int i=0;i<W;i++){
			int s,e,t;
			cin>>s>>e>>t;
			edges.push_back(Edge(s,e,-t));
		}
		if(Bellman_ford(1))	puts("YES");  //从1可达所有点 
		else puts("NO");
	}
	return 0;
}

2.SPFA

//poj3259
#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
#include<cstring>
#include<cstdio>
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=510;
int F,M,N,W;

struct Edge{
	int e,w;
	Edge(int e_,int w_):e(e_),w(w_){}
	Edge(){}
};

vector<Edge> G[maxn];  //整个有向图
int updateTimes[maxn]; //最短路的更新次数 
int dist[maxn];  //dist[i]是源到i的目前最短路长度 

bool SPFA(int v){
	memset(dist,INF,sizeof(dist));
	dist[v]=0;
	queue<int> que;
	que.push(v);
	memset(updateTimes,0,sizeof(updateTimes));
	while(!que.empty()){
		int s=que.front();
		que.pop();
		for(int i=0;i<G[s].size();i++){
			int e=G[s][i].e;
			if(dist[e]>dist[s]+G[s][i].w){
				dist[e]=dist[s]+G[s][i].w;
				que.push(e);
				updateTimes[e]++;
				if(updateTimes[e]>=N) return true;
			}
		}
	}
	return false;
} 

int main(){
	cin>>F;
	while(F--){
		cin>>N>>M>>W;
		for(int i=1;i<maxn;i++)
			G[i].clear();
		for(int i=0;i<M;i++){
			int s,e,t;
			cin>>s>>e>>t;
			G[s].push_back(Edge(e,t));
			G[e].push_back(Edge(s,t));
		}
		for(int i=0;i<W;i++){
			int s,e,t;
			cin>>s>>e>>t;
			G[s].push_back(Edge(e,-t));
		}
		if(SPFA(1))	puts("YES");  
		else puts("NO");
	}
	return 0;
}

 

    原文作者:Bellman - ford算法
    原文地址: https://blog.csdn.net/qq_37275680/article/details/83302824
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞