• 最短路基础


    http://acm.hdu.edu.cn/showproblem.php?pid=2544

    Dijkstra邻接链表(适用于边少,顶点多):

     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<string.h>
     4 #include<algorithm>
     5 #define INF 0xfffffff
     6 #define N 1100
     7 #include<vector>
     8 using namespace std;
     9 
    10 struct node
    11 {
    12     int e,w;
    13 };
    14 
    15 int n,m,vis[N],dist[N];
    16 vector<node>G[N];
    17 
    18 void Dij(int Start,int End)
    19 {
    20     int i,j,Min,index;
    21     vis[Start]=1;
    22     dist[Start]=0;
    23 
    24     node p;
    25     for(i=1; i<=n; i++)
    26     {
    27         Min=INF;
    28         index=Start;
    29         for(j=1; j<=n; j++)
    30             if(vis[j]==0&&Min>dist[j])
    31                 Min=dist[j],index=j;
    32         vis[index]=1;
    33         int len=G[index].size();
    34         for(j=0; j<len; j++)
    35         {
    36             p=G[index][j];
    37             if(vis[p.e]==0&&dist[p.e]>dist[index]+p.w)
    38                 dist[p.e]=dist[index]+p.w;
    39         }
    40     }
    41 
    42 }
    43 
    44 int main()
    45 {
    46     int i,a,b,c;
    47     node p;
    48     while(scanf("%d%d",&n,&m),m+n)
    49     {
    50         for(i=0; i<N; i++)
    51         {
    52             dist[i]=INF;
    53             vis[i]=0;
    54             G[i].clear();
    55         }
    56         for(i=0; i<m; i++)
    57         {
    58             scanf("%d%d%d",&a,&b,&c);
    59             p.e=b;
    60             p.w=c;
    61             G[a].push_back(p);
    62             p.e=a;
    63             G[b].push_back(p);
    64         }
    65         Dij(1,n);
    66         printf("%d
    ",dist[n]);
    67     }
    68     return 0;
    69 }
    View Code

    Dijkstra链接矩阵(适用于变多,顶点少):

    #include<iostream>
    #include<algorithm>
    #include<stdio.h>
    #include<string.h>
    using namespace std;
    #define INF 0xfffffff
    #define N 1100
    int n,m,maps[N][N],dist[N],vis[N];//dist[i]表示从起点到i的最短距离;
    void Dij(int Star ,int End)
    {
        int i,j,index,Min;
        dist[Star]=0;
        vis[Star]=1;
        index=Star;
        for(i=1;i<=n;i++)
        {
            Min=INF;
            for(j=1;j<=n;j++)
            {
                if(Min>dist[j]&&vis[j]==0)
                {
                    Min=dist[j];
                    index=j;
                }
            }
            vis[index]=1;
            for(j=1;j<=n;j++)
            {
                if(vis[j]==0&&dist[j]>dist[index]+maps[index][j])
                    dist[j]=dist[index]+maps[index][j];
            }
        }
    }
    int main()
    {
        while(scanf("%d%d",&n,&m),m+n)
        {
            int i,j,a,b,c;
            for(i=0;i<N;i++)
            {
                for(j=0;j<N;j++)
                {
                    maps[i][j]=INF;
                }
                vis[i]=0;
                dist[i]=INF;
            }//初始化;
            for(i=0;i<m;i++)
            {
                scanf("%d%d%d",&a,&b,&c);
                maps[a][b]=min(maps[a][b],c);
                maps[b][a]=maps[a][b];
            }
            Dij(1,n);
            printf("%d
    ",dist[n]);
        }
        return 0;
    }
    View Code

    Floyd:

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #define INF 0xfffffff
    #define N 1100
    using namespace std;
    int n,m;
    int maps[N][N];
    void Floyd()
    {
        int i,j,k;
        for(k=1; k<=n; k++)
            for(i=1; i<=n; i++)
            {
                for(j=1; j<=n; j++)
                    maps[i][j]=min(maps[i][j],maps[i][k]+maps[k][j]);
            }
    }
    void Init()
    {
        int i,j;
        for(i=0; i<=n; i++)
            for(j=0; j<=n; j++)
                if(i==j)
                    maps[i][j]=0;
                else
                    maps[i][j]=INF;
    }
    int main()
    {
        int i,a,b,c;
        while(scanf("%d%d",&n,&m),m+n)
        {
            Init();
            for(i=0; i<m; i++)
            {
                scanf("%d%d%d",&a,&b,&c);
                maps[a][b]=maps[b][a]=c;
            }
            Floyd();
            printf("%d
    ",maps[1][n]);
        }
        return 0;
    }
    View Code

     spfa(适用于点多或者有负环的情况):

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<queue>
    #define INF 0xfffffff
    #define N 1010
    using namespace std;
    int Head[N], cnt, dist[N], n, vis[N];
    struct Edge
    {
        int v, w, next;
    } e[N*2];
    void Add(int u, int v, int w)
    {
        e[cnt].v=v;
        e[cnt].w=w;
        e[cnt].next=Head[u];
        Head[u]=cnt++;
    }
    int spfa(int s)
    {
        queue<int>Q;
        int u, v;
        memset(vis, 0, sizeof(vis));
        dist[s]=0;
        vis[s]=1;
        Q.push(s);
        while(Q.size())
        {
            u=Q.front();
            Q.pop();
            vis[u]=0;
            for(int i=Head[u]; i!=-1; i=e[i].next)
            {
                v=e[i].v;
                if(dist[v]>dist[u]+e[i].w)
                {
                    dist[v]=dist[u]+e[i].w;
                    if(!vis[v])
                    {
                        vis[v]=1;
                        Q.push(v);
                    }
                }
            }
        }
        return dist[n];
    }
    int main()
    {
        int m, a, b, c;
        while(scanf("%d%d", &m, &n)!=EOF)
        {
            memset(Head, -1, sizeof(Head));
            for(int i=0; i<=n; i++)
                dist[i] = INF;
            for(int i=1; i<=m; i++)
            {
                scanf("%d %d %d", &a, &b, &c);
                Add(a, b, c);
                Add(b, a, c);
            }
            int ans = spfa(1);
            printf("%d
    ", ans);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    RPMBUILD源码打包资源汇总(转)
    grep命令:查看配置文件未注释行(转)
    数据结构实验之查找三:树的种类统计(SDUT 3375)
    数据结构实验之查找三:树的种类统计(SDUT 3375)
    数据结构实验之查找四:二分查找(SDUT 3376)
    数据结构实验之查找五:平方之哈希表 (SDUT 3377)
    数据结构实验之查找一:二叉排序树 (SDUT 3373)
    python 正则表达式
    python #!/usr/bin/python 的作用
    欢迎使用CSDN的markdown编辑器
  • 原文地址:https://www.cnblogs.com/zhengguiping--9876/p/4663315.html
Copyright © 2020-2023  润新知