zoukankan      html  css  js  c++  java
  • (SPFA)hdu 2544

    最短路

    Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 34898    Accepted Submission(s): 15109


    Problem Description
    在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的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
     
    Source
     
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<cmath>
    #include<cstdlib>
    #include<algorithm>
    #include<queue>
    #include<set>
    #include<vector>
    using namespace std;
    #define INF 1<<30
    vector<int> e[10010],w[10010];
    queue<int> q;
    int n,m,dist[110],vis[110];
    void spfa()
    {
         int x;
         while(!q.empty()) q.pop();
         memset(vis,0,sizeof(vis));
         vis[1]=1;
         q.push(1);
         while(!q.empty())
         {
             x=q.front(),q.pop();
             for(int i=0;i<e[x].size();i++)
             {
                   if(dist[x]+w[x][i]<dist[e[x][i]])
                   {
                         dist[e[x][i]]=dist[x]+w[x][i];
                         if(!vis[e[x][i]])
                            vis[e[x][i]]=1,q.push(e[x][i]);
                   }
             }
             vis[x]=0;
         }
    }
    int main()
    {
          while(scanf("%d%d",&n,&m)!=EOF)
          {
                if(n==0&&m==0)
                      break;
                for(int i=0;i<=10000;i++)
                      e[i].clear(),w[i].clear();
                for(int i=1;i<=n;i++)
                      dist[i]=INF;
                dist[1]=0;
                for(int i=1;i<=m;i++)
                {
                      int x,y,z;
                      scanf("%d%d%d",&x,&y,&z);
                      e[x].push_back(y);
                      e[y].push_back(x);
                      w[x].push_back(z);
                      w[y].push_back(z);
                }
                spfa();
                printf("%d
    ",dist[n]);
          }
    }
    

      

  • 相关阅读:
    在HTML中使用css3实现雪人动画效果
    不一样的函数防抖和节流
    2020全球C++及系统软件技术大会成功落下帷幕
    详解flex布局做骰子案例
    LeetCode-环形链表|+环形链表||
    03:成绩排序
    02:奇数单增序列
    谁考了第k名
    【23.59%】【hdu 5883】The Best Path
    【30.53%】【hdu 5878】I Count Two Three
  • 原文地址:https://www.cnblogs.com/a972290869/p/4238789.html
Copyright © 2011-2022 走看看