1381:城市路(Dijkstra)--模板题

http://ybt.ssoier.cn:8088/problem_show.php?pid=1381

方法一:邻接矩阵存图写法

#include<cstdio>
#include<cstring>
#define inf 0x3f3f3f3f
int m, n;
int a, b, c;
int g[2005][2005];
int dis[2005], vis[2005];
inline int read()
{
    int x=0, f=1;  char ch=getchar();
    while(ch<'0' || ch>'9'){ if(ch=='-')f=-1; ch=getchar();}
    while(ch>='0' && ch<='9'){ x=x*10+ch-'0'; ch=getchar();}
    return x*f;
}
void dijs(int s)
{
    for(int i=1; i<=n; i++)dis[i]=g[s][i];
    dis[s]=0;
    vis[s]=1;
    for(int i=1; i<n; i++)
    {
        int mindis=inf, temp;
        for(int j=1; j<=n; j++)
        {
            if(vis[j]==0&&dis[j]<mindis)
            {
                mindis=dis[j];
                temp=j;
            }
        }
        vis[temp]=1;
        for(int j=1; j<=n; j++)
        {
            if(dis[j]>dis[temp]+g[temp][j])
                dis[j]=dis[temp]+g[temp][j];
        }
    }
    
}
int main()
{
    n=read(); m=read();
    memset(g, inf, sizeof(g));
    for(int i=1; i<=n; i++)g[i][i]=0;
    for(int i=1; i<=m; i++)
    {
        a=read(); b=read(); c=read();
        if(g[a][b]>c)
        g[a][b]=g[b][a]=c;  //注意无向图存储两次 
    }
    dijs(1);
    if(dis[n]==inf)printf("-1");
    else printf("%d",dis[n]);
    
    return 0;
}

方法二:邻接表(vector)存图写法

#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
#define inf 0x3f3f3f3f
int m, n;
int s, t, d;
int dis[200005], vis[200005];
inline int read()
{
    int x=0, f=1;  char ch=getchar();
    while(ch<'0' || ch>'9'){ if(ch=='-')f=-1; ch=getchar();}
    while(ch>='0' && ch<='9'){ x=x*10+ch-'0'; ch=getchar();}
    return x*f;
}
struct node{
    int u;int v; int w;
}E;
vector <node> edge[400005];
void dijs(int s)
{
    memset(dis, 0x3f, sizeof(dis));
    for(int j=0; j<edge[s].size(); j++)
    {
        E=edge[s][j];
        if(dis[E.v]>E.w)dis[E.v]=E.w;//多条边存储最短 
    }    

    dis[s]=0;vis[s]=1;
    //for(int i=1; i<=n; i++)printf("%d ",dis[i]);
    
    for(int i=1; i<n; i++)
    {
        int mindis=inf, mins;
        for(int j=1; j<=n; j++)
        {
            if(vis[j]==0 && dis[j]<mindis)
            {
                mindis=dis[j];
                mins=j;
            }
        }
        vis[mins]=1;
        for(int j=0; j<edge[mins].size(); j++)//此处要比邻接矩阵快,时间复杂度为m 
        {
            E=edge[mins][j];
            if(dis[E.v]>dis[mins]+E.w && vis[E.v]==0)//此处vis[E.v]必须写,容易忘掉 
                dis[E.v]=dis[mins]+E.w;
        }    
    }
}
int main()
{
    
    n=read(); m=read();
    for(int i=1; i<=m; i++)
    {
        s=read();t=read();d=read();
        E.v=t;E.w=d;
        edge[s].push_back(E);
        E.v=s;E.w=d;
        edge[t].push_back(E);        //注意此处无向图存两遍        
    }
    
//    for(int i=1; i<=n; i++)
//    {
//        for(int j=0; j<edge[i].size(); j++)
//        {
//            E=edge[i][j];
//            printf("%d-%d=%d
",i,E.v,E.w);
//        }
//        
//    }
    dijs(1);
    printf("%d",dis[n]);
    
    return 0;
}
原文地址:https://www.cnblogs.com/tflsnoi/p/10387966.html