zoukankan      html  css  js  c++  java
  • 最短路(hdu2544)

    在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? 
     

    Input

    输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。 
    输入保证至少存在1条商店到赛场的路线。 

    Output

    对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间

    Sample Input

    2 1
    1 2 3
    3 3
    1 2 5
    2 3 5
    3 1 2
    0 0
    Sample Output

    3
    2

    #include<bits/stdc++.h>
    using namespace std;
    struct node
    {
        int e;
        int w;
     
    };
    struct cmp
    {
        bool operator()(const node &a,const node &b)
        {
     
                return a.w>b.w;
     
        }
    };
    int main()
    {
        int n,m;
        while(scanf("%d%d",&n,&m)==2&&(n||m))
        {
            if(n==0&&m==0)  break;
            priority_queue<node,vector<node>,cmp>que;
            vector<node>v[1001];
            int vis[1001]={0};
            node x;
            while(m--)
            {
                int a,b,d;
                scanf("%d %d %d",&a,&b,&d);
                x.e=b,x.w=d;
                v[a].push_back(x);
                x.e=a;
                v[b].push_back(x);
            }
     
            x.e=1,x.w=0;
            que.push(x);
            while(!que.empty())
            {
                x=que.top();
                que.pop();
                vis[x.e]=1;
                if(x.e==n)
                    break;
                for(int i=0,j=v[x.e].size(); i<j; i++)
                {
                    node q;
                    q.e=v[x.e][i].e;
                    if(vis[q.e])
                        continue;
                    q.w=x.w+v[x.e][i].w;
     
                    que.push(q);
                }
            }
            printf("%d
    ",x.w);
        }
    }

    要注意的是for循环是从0开始还是从1开始是根据题目给出地点的编号决定的

    解题思路:

    Dijkstra模板题。

    Dijkstra的大致思想是:

    从起点出发,不断更新能够到达的点的最短距离dis.

    每扩展一个点就重新更新下其他所有点到起点的最短距离dis,这个过程就是“松弛”

    AC代码:

     1 #include<stdio.h>
     2 #include<string.h>
     3 #define INF 0x3f3f3f3f
     4  
     5 int mp[1010][1010],dis[1010],book[1010],n,m;
     6  
     7 void dijkstra()
     8 {
     9     for(int i=1;i<=n;i++)
    10     {
    11         dis[i]=mp[1][i];
    12     }
    13     for(int i=1;i<=n-1;i++)//找n-1轮 
    14     {
    15         int minn=INF,u;
    16         for(int j=1;j<=n;j++)//找与上一个点最近的点 
    17         {
    18             if(book[j]==0&&dis[j]<minn)
    19             {
    20                 minn=dis[j];
    21                 u=j;
    22             }
    23         }
    24         book[u]=1;
    25         for(int j=1;j<=n;j++)//找着最近的点后通过这个最近的点更新其余的点到起点的距离 
    26         {
    27             if(book[j]==0&&dis[u]+mp[u][j]<dis[j])//book[j]==0和dis[j]<INF看心情写吧= = 
    28             {
    29                 dis[j]=dis[u]+mp[u][j];
    30             }
    31         }
    32     }
    33     printf("%d
    ",dis[n]);
    34 }
    35  
    36 int main()
    37 {
    38     while(~scanf("%d%d",&n,&m)&&n+m)
    39     {
    40         for(int i=1;i<=n;i++)//下标从0还是1开始由题目的标号决定 
    41         {
    42             for(int j=1;j<=n;j++)//如果是0建议都从0开始计数,是1则1 
    43             {
    44                 if(i==j) mp[i][j]=0;
    45                 else mp[i][j]=INF;
    46             }
    47         }
    48         memset(book,0,sizeof(book));
    49         
    50         int u,v,w;
    51         for(int i=1;i<=m;i++)
    52         {
    53             scanf("%d%d%d",&u,&v,&w);
    54             if(w<mp[u][v]) mp[u][v]=mp[v][u]=w;
    55         }
    56         dijkstra();//这道题固定起点为1,也可在函数里自定义起点 
    57     }
    58     return 0;
    59 }
  • 相关阅读:
    Unique Binary Search Trees 解答
    Unique Paths II 解答
    Unique Paths 解答
    Maximum Subarray 解答
    Climbing Stairs 解答
    House Robber II 解答
    House Robber 解答
    Valid Palindrome 解答
    Container With Most Water 解答
    Remove Duplicates from Sorted List II 解答
  • 原文地址:https://www.cnblogs.com/DWVictor/p/10279710.html
Copyright © 2011-2022 走看看