最短路
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;
}