最短路

Dijkstra算法

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll inf=1e18+10;
vector< pair<ll,ll> > G[100000+10];
ll n,m,s,d[100000+10];
bool vis[100000+10];
void dijkstra(){
	priority_queue<pair<ll,ll>,vector<pair<ll,ll> >,greater<pair<ll,ll> > > que;
	for(ll i=1;i<=n;i++)d[i]=inf;
	d[s]=0;
	que.push(make_pair(0,s));
	while(que.empty()==false){
		ll u=que.top().second;que.pop();
		if(vis[u])continue;
		vis[u]=true;
		for(ll i=0;i<G[u].size();i++){
			ll v=G[u][i].first,w=G[u][i].second;
			if(d[v]>d[u]+w){
				d[v]=d[u]+w;
				que.push(make_pair(d[v],v));
			}
		}
	}
}
int main(){
	cin >> n >> m >> s;
	for(ll i=1;i<=m;i++){
		ll u,v,w;
		cin >> u >> v >> w;
		G[u].push_back(make_pair(v,w));
	}
	dijkstra();
	for(ll i=1;i<=n;i++){
		cout << d[i] << ' ';
	}
	return 0;
}

spfa求负环

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll inf=1e18;
vector<pair<ll,ll> > G[2000+10];
ll d[2000+10],cnt[2000+10];
bool vis[2000+10];
ll n,m;
bool spfa(){
	fill(d,d+1+n,inf);
	fill(vis,vis+1+n,false);
	fill(cnt,cnt+1+n,0);
	queue<ll> que;
	d[1]=0;
	vis[1]=true;
	que.push(1);
	while(que.size()){
		ll u=que.front();que.pop();
		vis[u]=false;
		for(ll i=0;i<G[u].size();i++){
			ll v=G[u][i].first,w=G[u][i].second;
			if(d[v]>d[u]+w){
				d[v]=d[u]+w;
				if(vis[v]==false)que.push(v),vis[v]=true;
				if((cnt[v]=cnt[u]+1)>=n)return true;
			}
		}
	}
	return false;
}
int main(){
	int T;
	cin >> T;
	while(T--){
		cin >> n >> m;
		for(ll i=1;i<=n;i++)G[i].clear();
		for(ll i=1;i<=m;i++){
			ll u,v,w;
			cin >> u >> v >> w;
			G[u].push_back(make_pair(v,w));
			if(w>=0)G[v].push_back(make_pair(u,w));
		}
		cout << (spfa()?"YES":"NO") << endl;
	}
	return 0;
}

差分约束

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll inf=1e18;
vector<pair<ll,ll> > G[5000+10];
ll n,m;
ll d[5000+10],cnt[5000+10];
bool vis[5000+10];
bool spfa(){
	fill(d,d+1+n,inf);
	queue<ll> que;
	que.push(0);
	vis[0]=true;
	d[0]=0;
	while(que.size()){
		ll u=que.front();que.pop();
		vis[u]=false;
		for(ll i=0;i<G[u].size();i++){
			ll v=G[u][i].first,w=G[u][i].second;
			if(d[v]>d[u]+w){
				d[v]=d[u]+w;
				if(vis[v]==false)que.push(v),vis[v]=true;
				if((cnt[v]=cnt[u]+1)>=n+1)return true;
			}
		}
	}
	return false;
}
int main(){
	cin >> n >> m;
	for(ll i=1;i<=m;i++){
		ll u,v,w;
		cin >> u >> v >> w;
		G[v].push_back(make_pair(u,w));
	}
	for(ll i=1;i<=n;i++){
		G[0].push_back(make_pair(i,0));
	}
	if(spfa()==true){
		cout << "NO" << endl;
	}else{
		for(ll i=1;i<=n;i++){
			cout << d[i] << ' ';
		}
	}
	return 0;
}
posted @ 2023-11-21 11:27  Alric  阅读(4)  评论(0编辑  收藏  举报