SPFA模板
- O(kE)=O(E),k为常数,即遍历所有边;可退化成O(VE)
-
#include<bits/stdc++.h> #define MAXM 500010 #define MAXN 100010 using namespace std; int n,m,s,tot; int head[MAXN],dis[MAXN],cnt[MAXN]; bool vis[MAXN]; struct node{ int to,w,nxt; }e[MAXM]; void add(int u,int v,int w){ e[tot].to=v; e[tot].w=w; e[tot].nxt=head[u]; head[u]=tot; } void SPFA(int s){ queue<int>q; dis[s]=0; q.push(s); while(!q.empty()){ int u=q.front();q.pop(); vis[u]=0; for(int i=head[u];i;i=e[i].nxt){ int v=e[i].to,w=e[i].w; if(dis[v]>dis[u]+w){ dis[v]=dis[u]+w; cnt[v]=cnt[u]+1; if(cnt[v]>n){cout<<"有负环"<<endl;return;} if(!vis[v]){ vis[v]=1; q.push(v); } } } } } int main(){ scanf("%d%d%d",&n,&m,&s); for(int i=1;i<=n;i++) dis[i]=1e9; for(int i=1;i<=m;i++){ int u,v,w; scanf("%d%d%d",&u,&v,&w); add(u,v,w); } SPFA(s); for(int i=1;i<=n;i++){ if(dis[i]>=1e9) printf("2147483647 "); else printf("%d ",dis[i]); } return 0; }
快乐女孩 人生信条:忘掉烦恼 及时行乐