基础模板
#include<bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define pb push_back
#define PII pair<int,int >
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
const int N = 1e6+10;
int n,m,s;
bool vis[N];
int dis[N];
vector<PII> v[N];
void spfa(int s)
{
queue<int> q;
for(int i=1;i<=n;i++)
{
dis[i] = 1e9;
}
vis[s] = 1;
dis[s] = 0;
q.push(s);
while(q.size())
{
int now = q.front();
q.pop();
vis[now] = 0;
for(auto t:v[now])
{
int spot = t.fi,w = t.se;
if(dis[spot]>dis[now]+w)
{
dis[spot] = dis[now]+w;
if(vis[spot]==0)
{
vis[spot]=1;
q.push(spot);
}
}
}
}
}
int main()
{
IOS;
cin>>n>>m;
while(m--)
{
int a,b,w;
cin>>a>>b>>w;
v[a].pb({b,w});
}
cin>>s;
spfa(s);
}
P3371 【模板】单源最短路径(弱化版)
#include<bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define PII pair<int,int >
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
const int N = 1e6+10;
int n,m,s;
vector< pair<int,int> > v[N];
int dis[N];
bool vis[N];
void spfa()
{
for(int i=1;i<=n;i++)
{
dis[i] = 1e9;
vis[i] = 0;
}
queue<int> q;
q.push(s);
dis[s] = 0;
vis[s] = 1;
while(q.size())
{
int now = q.front();
q.pop();
vis[now] = 0;
for(auto t:v[now])
{
int spot = t.fi,w =t.se;
if(dis[spot]>dis[now]+w)
{
dis[spot] = dis[now]+w;
if(vis[spot]==0)
{
vis[spot] = 1;
q.push(spot);
}
}
}
}
}
int main()
{
IOS;
cin>>n>>m>>s;
while(m--)
{
int a,b,c;
cin>>a>>b>>c;
v[a].pb({b,c});
}
spfa();
for(int i=1;i<=n;i++)
{
if(dis[i]==1e9) cout<<(1ll<<31)-1<<' ';
else cout<<dis[i]<<" ";
}
}
P3385 【模板】负环
#include<bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define PII pair<int,int >
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
const int N = 1e6+10;
int n,m;
bool vis[N];
int dis[N];
int cnt[N];
vector<PII> v[N];
bool spfa()
{
queue<int> q;
for(int i=1;i<=n;i++)
{
dis[i] = 1e9;
vis[i] = 0;
cnt[i] = 0;
}
vis[1] = 1;
dis[1] = 0;
q.push(1);
while(q.size())
{
int now = q.front();
q.pop();
vis[now] = 0;
for(auto t:v[now])
{
int spot = t.fi,w = t.se;
if(dis[spot]>dis[now]+w)
{
cnt[spot] = cnt[now]+1;
if(cnt[spot]>=n) return true;
dis[spot] = dis[now]+w;
if(vis[spot]==0)
{
q.push(spot);
vis[spot]=1;
}
}
}
}
return false;
}
int main()
{
IOS;
int k;
cin>>k;
while(k--)
{
cin>>n>>m;
for(int i=1;i<=max(n,m);i++)
{
v[i].clear();
dis[i] = 1e9;
vis[i] = 0;
cnt[i] = 0;
}
while(m--)
{
int a,b,c;
cin>>a>>b>>c;
if(c>=0) v[a].pb({b,c}),v[b].pb({a,c});
else v[a].pb({b,c});
}
if(spfa()) cout<<"YES"<<"\n";
else cout<<"NO"<<"\n";
}
}
那如果存在非连通的点呢?
bool spfa()
{
queue<int> q;
for(int i=1;i<=n;i++)
{
dis[i] = 1e9;
vis[i] = 0;
cnt[i] = 0;
}
vis[n+1] = 1;
dis[n+1] = 0;
q.push(n+1);
}
int main()
{
for(int i=1;i<=n;i++)
{
v[n+1].pb({i,0});
}
}
P3905 道路重建
#include<bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define PII pair<int,int >
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
const int N = 1e6+10;
int n,m,d,A,B;
int dis[N];
bool vis[N];
vector<PII> v[N];
map<pair<int,int>,int> mp;
void spfa()
{
for(int i=1;i<=n;i++)
{
dis[i] = 1e9;
vis[i] = 0;
}
queue<int> q;
q.push(A);
dis[A] = 0;
vis[A] = 1;
while(q.size())
{
int now = q.front();
q.pop();
vis[now] = 0;
for(auto t:v[now])
{
int spot = t.fi,w = 0;
if(mp[{now,spot}]==1) w = t.se;
if(dis[spot]>dis[now]+w)
{
dis[spot] = dis[now]+w;
if(vis[spot]==0)
{
vis[spot] = 1;
q.push(spot);
}
}
}
}
}
int main()
{
IOS;
cin>>n>>m;
while(m--)
{
int a,b,c;
cin>>a>>b>>c;
v[a].pb({b,c});
v[b].pb({a,c});
}
cin>>d;
while(d--)
{
int a,b;
cin>>a>>b;
mp[{a,b}] = 1;
mp[{b,a}] = 1;
}
cin>>A>>B;
spfa();
cout<<dis[B];
}
P1629 邮递员送信
#include<bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define pb push_back
#define PII pair<int,int >
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
const int N = 1e6+10;
int n,m;
vector<PII> v1[N];
vector<PII> v2[N];
bool vis1[N];
int dis1[N];
bool vis2[N];
int dis2[N];
int sum=0;
void spfa1(int s)
{
queue<int> q;
vis1[s] = 1;
for(int i=1;i<=n;i++)
{
dis1[i] = 1e9;
vis1[i] = 0;
}
dis1[s] = 0;
q.push(s);
while(q.size())
{
int now = q.front();
q.pop();
vis1[now] = 0;
for(auto t:v1[now])
{
int spot = t.fi,w = t.se;
if(dis1[spot]>dis1[now]+w)
{
dis1[spot] = dis1[now]+w;
if(vis1[spot]==0)
{
vis1[spot] = 1;
q.push(spot);
}
}
}
}
}
void spfa2(int s)
{
queue<int> q;
vis2[s] = 1;
for(int i=1;i<=n;i++)
{
dis2[i] = 1e9;
vis2[i] = 0;
}
dis2[s] = 0;
q.push(s);
while(q.size())
{
int now = q.front();
q.pop();
vis2[now] = 0;
for(auto t:v2[now])
{
int spot = t.fi,w = t.se;
if(dis2[spot]>dis2[now]+w)
{
dis2[spot] = dis2[now]+w;
if(vis2[spot]==0)
{
vis2[spot] = 1;
q.push(spot);
}
}
}
}
}
int main()
{
IOS;
cin>>n>>m;
while(m--)
{
int a,b,l;
cin>>a>>b>>l;
v1[a].pb({b,l});
v2[b].pb({a,l});
}
spfa1(1);
spfa2(1);
for(int i=1;i<=n;i++)
{
sum+=dis1[i];
sum+=dis2[i];
}
cout<<sum;
}
P2136 拉近距离
#include<bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define pb push_back
#define PII pair<int,int >
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
const int N = 1e6+10;
int n,m,T;
int cnt[N];
bool vis[N];
int dis[N];
vector<PII> v[N];
bool suc = 0;
void spfa(int s)
{
queue<int> q;
for(int i=1;i<=n;i++)
{
dis[i] = 1e9;
vis[i] = 0;
cnt[i] = 0;
}
vis[s] = 1;
dis[s] = 0;
q.push(s);
while(q.size())
{
int now = q.front();
q.pop();
vis[now] = 0;
for(auto t:v[now])
{
int spot = t.fi,w = t.se;
if(dis[spot]>dis[now]-w)
{
cnt[spot] = cnt[now]+1;
if(cnt[spot]>=n)
{
suc= 1;
return;
}
dis[spot] = dis[now]-w;
if(vis[spot]==0)
{
vis[spot]=1;
q.push(spot);
}
}
}
}
}
int main()
{
IOS;
cin>>n>>m;
while(m--)
{
int a,b,w;
cin>>a>>b>>w;
v[a].pb({b,w});
}
int minn=1e9;
spfa(1);
minn = min(minn,dis[n]);
spfa(n);
minn = min(minn,dis[1]);
if(suc) cout<<"Forever love";
else cout<<minn;
}