最短路

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;
 }

  

posted @ 2022-09-23 15:01  Bertidurlah  阅读(30)  评论(1)    收藏  举报