最短路
P3371 【模板】单源最短路径(弱化版)
P4779 【模板】单源最短路径(标准版)
\(Floyed\)
il void floyd()
{
for(ru k=1;k<=n;++k)
for(ru i=1;i<=n;++i)
for(ru j=1;j<=n;++j)
mp[i][j]=min(mp[i][k]+mp[k][j],mp[i][j]);
}
\(SPFA\)
点击查看代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#define il inline
#define ri register
#define pc(i) putchar(i);
using namespace std;
const int N=1e5+2,M=1e6+2,inf=0x3f3f3f3f;
int tot,dis[N],head[N],n,m,s;
bool vis[N];
struct node{int nxt,to,w;}edge[M];
il int read()
{
int as=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9') f=ch=='-'?-1:1,ch=getchar();
while(ch>='0'&&ch<='9') as=(as<<3)+(as<<1)+(ch^48),ch=getchar();
return as*f;
}
il void wt(int x){if(x<0){pc('-');x=-x;}if(x>9)wt(x/10);pc(x%10+48);}
il void add(const int u,const int v,const int w)
{
edge[++tot].w=w,edge[tot].to=v,
edge[tot].nxt=head[u],head[u]=tot;
}
il void SPFA(int u)
{
queue<int>q;
for(ri int i=1;i<=n;++i) vis[i]=0,dis[i]=inf;
dis[u]=0,vis[u]=1,q.push(u);
while(!q.empty())
{
int o=q.front();q.pop(),vis[o]=0;
for(ri int i=head[o];i;i=edge[i].nxt)
{
int to=edge[i].to;
if(dis[to]>dis[o]+edge[i].w)
{
dis[to]=dis[o]+edge[i].w;
if(!vis[to]) vis[to]=1,q.push(to);
}
}
}
}
int main()
{
n=read(),m=read(),s=read();
for(ri int i=1,u,v,w;i<=m;++i)
u=read(),v=read(),w=read(),add(u,v,w);
SPFA(s);
for(ri int i=1;i<=n;++i) wt(dis[i]),pc(' ');
return 0;
}
\(Dijkstra\)
朴素版本
点击查看代码
#include<bits/stdc++.h>
#define il inline
#define ri register int
#define int long long
using namespace std;
struct Node{
int nxt;
int to;
int w;
}edge[233333];
const int inf=0x3f3f3f3f,a=pow(2,31)-1;
int dis[111111],head[111111],tot,n,m,s;//+
bool vis[111111];//+
il void init()
{
memset(vis,0,sizeof(vis));
memset(dis,inf,sizeof(dis));
memset(head,-1,sizeof(head));
tot=0;
}
il void add(int u,int v,int w)
{
edge[tot].to=v,edge[tot].w=w,edge[tot].nxt=head[u];
head[u]=tot,tot++;
}
il void dijkstra()
{
int minn,pos=s;
while(1)
{
minn=inf,pos=-1;
for(ri i=1;i<=n;i++)
if(!vis[i]&&dis[i]<minn)
minn=dis[i],pos=i;
if(pos==-1) break;
vis[pos]=1;
for(ri i=head[pos];i!=-1;i=edge[i].nxt)
{
int t=edge[i].to;
if(!vis[t]&&dis[t]>dis[pos]+edge[i].w)
dis[t]=dis[pos]+edge[i].w;
}
}
return;
}
signed main()
{
// freopen("1.in","r",stdin);
// freopen("1.out","w",stdout);
scanf("%lld%lld%lld",&n,&m,&s);
init();
for(ri i=1;i<=m;i++)
{
int u,v,w;
scanf("%lld%lld%lld",&u,&v,&w);
add(u,v,w);
}
dis[s]=0;
dijkstra();
for(ri i=1;i<=n;i++)
{
if(dis[i]!=inf) printf("%lld ",dis[i]);
else printf("%lld ",a);
}
return 0;
}
堆优化(优先队列)
点击查看代码
#include<bits/stdc++.h>
#define il inline
#define cs const
#define pc(i) putchar(i)
#define fo(i,j,k) for(int i=(j);i<=(k);++i)
#define pii pair<int,int>
#define fi first
#define se second
using namespace std;
cs int N=3e5+7,inf=2147483647;
int FL,CH;
template<typename T> bool in(T&a)
{
for(FL=1;!isdigit(CH)&&CH!=EOF;CH=getchar())
if(CH=='-')FL=-1;
for(a=0;isdigit(CH);CH=getchar())
a=a*10+CH-'0';
return a*=FL,CH==EOF?0:1;
}
template<typename T,typename...Args>
int in(T&a,Args&...args){return in(a)+in(args...);}
void wt(int x){if(x<0) x=-x,pc('-');if(x>9) wt(x/10);pc(x%10|48);}
struct node{int nxt,to,w;}e[N<<1];
int dis[N],h[N],eoe,n,m,s;
bool vis[N];
il void add(cs int u,cs int v,cs int w){e[++eoe]={h[u],v,w},h[u]=eoe;}
il void Dij(cs int ss)
{
priority_queue<pii,vector<pii>,greater<pii> > q;
fo(i,1,n) dis[i]=inf; dis[ss]=0,q.push((pii){0,ss});
while(!q.empty())
{
pii tmp=q.top(); q.pop(); int u=tmp.se;
if(vis[u]) continue; vis[u]=1;
for(int i=h[u],to;i;i=e[i].nxt)
if(!vis[to=e[i].to]&&dis[to]>dis[u]+e[i].w)
dis[to]=dis[u]+e[i].w,q.push((pii){dis[to],to});
}
}
signed main()
{
in(n,m,s); fo(i,1,m) {int u,v,w;in(u,v,w),add(u,v,w);}
Dij(s); fo(i,1,n) wt(dis[i]),pc(' ');
return 0;
}
\(Johnson\)
点击查看代码
#include<queue>
#include<cstdio>
#include<iostream>
#include<algorithm>
#define il inline
#define ri register
#define pc(i) putchar(i)
#define int long long
using namespace std;
const int N=3e3+10,M=6e3+10,inf=0x3f3f3f3f;//3e3
int dis[N],head[N],tot,n,m,cnt[N],h[N+M];bool vis[N];//h[N+M]!!!
struct node{int to,nxt,w;}edge[M+N];
il int read()
{
int as=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') as=(as<<3)+(as<<1)+(ch^48),ch=getchar();return as*f;
}
il void wt(int x){if(x<0)pc('-'),x=-x;if(x>9)wt(x/10);pc(x%10+48);}
il void add(int u,int v,int w){edge[++tot]=(node){v,head[u],w},head[u]=tot;}
il bool spfa(int x)
{
queue<int>q;q.push(x);
for(ri int i=1;i<=n;++i) h[i]=inf;h[x]=0;
while(!q.empty())
{
int u=q.front();q.pop(),vis[u]=false;
for(ri int i=head[u];i;i=edge[i].nxt)
{
int to=edge[i].to;
if(h[to]>h[u]+edge[i].w)
{
h[to]=h[u]+edge[i].w;
if(!vis[to])
{
cnt[to]++,vis[to]=true,q.push(to);
if(cnt[to]==n+1) return false;
}
}
}
}
return true;
}
il void dijkstra(int x)
{
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q;
for(ri int i=1;i<=n;++i) dis[i]=inf,vis[i]=0; dis[x]=0; q.push(make_pair(0,x));
while(!q.empty())
{
pair<int,int>tmp=q.top();int u=tmp.second;q.pop();
if(vis[u]) continue; vis[u]=true;
for(ri int i=head[u];i;i=edge[i].nxt)
{
int to=edge[i].to,w=edge[i].w;
if(!vis[to]&&dis[to]>dis[u]+w)
dis[to]=dis[u]+w,q.push(make_pair(dis[to],to));
}
}
}
signed main()
{
n=read(),m=read();
for(ri int i=1,u,v,w;i<=m;++i)
u=read(),v=read(),w=read(),add(u,v,w);
for(ri int i=1;i<=n;++i) add(n+1,i,0);
if(!spfa(n+1)) return puts("-1"),0;
for(ri int i=1;i<=n;++i)
for(ri int j=head[i];j;j=edge[j].nxt)
edge[j].w+=h[i]-h[edge[j].to];
for(ri int i=1,ans=0;i<=n;++i)
{
dijkstra(i);
for(ri int j=1;j<=n;++j)
if(dis[j]==inf) ans+=j*1e9;
else ans+=(dis[j]+h[j]-h[i])*j;
wt(ans),pc('\n'),ans=0;
}
return 0;
}

浙公网安备 33010602011771号