zoukankan      html  css  js  c++  java
  • 最短路

    最短路

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


    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
     
     
    最短路模板题
     1 #include <bits/stdc++.h>
     2 #define N 1000
     3 #define inf 0x3f3f3f3f
     4 using namespace std;
     5 int n, m;
     6 struct Node{
     7     int to, value;
     8     friend bool operator<(const Node &a , const Node &b)
     9     {
    10         return a.value > b.value;   // ascending sort
    11     }
    12 };
    13 vector<Node> v[N];
    14 int vis[N];
    15 int val[N];
    16 int ans = 0;
    17 
    18 void short_path(int x){
    19     priority_queue<Node> q;
    20     q.push({x,0});
    21     while(!q.empty()){
    22         Node node = q.top();
    23          q.pop();
    24          if(vis[node.to] == 1)
    25             continue;
    26         vis[node.to] = 1;
    27         val[node.to] = min(val[node.to], node.value);
    28         ans ++;
    29         if(ans == n) break;
    30 
    31         for(int i = 0; i < v[node.to].size(); i ++){
    32             Node an = v[node.to][i];
    33             if(vis[an.to] == 0){
    34                 q.push({an.to, val[node.to]+an.value});
    35             }
    36         }
    37     }
    38 }
    39 
    40 int main(){
    41     int x, y, z;
    42     while(cin >> n >> m && n != 0 && m != 0){
    43         memset(vis, 0, sizeof(vis));
    44         memset(val, inf, sizeof(val));
    45         ans = 0;
    46         for(int i = 0; i < 1000; i++)
    47             v[i].clear();
    48         for(int i = 0; i < m; i ++){
    49             cin >> x >> y >> z;
    50             v[x].push_back({y, z});
    51             v[y].push_back({x, z});
    52         }
    53         short_path(1);
    54         cout<< val[n] << endl;
    55     }
    56     return 0;
    57 }
  • 相关阅读:
    Bitmap\Bytes\BitmapImage相互转换
    枚举值为什么使用1,2,4,8,16,32等2的幂方(转)
    获取电脑信息
    操作内存的帮助类
    C#调用DLL(整理)
    [原]java集合类TreeMap和TreeSet
    [原]《面试题精选》08.颠倒句子中单词的顺序
    [原]数据结构与对象的区别
    [原]初步了解Hadoop平台
    [原]《程序员面试题精选》06.查找最小的k个元素
  • 原文地址:https://www.cnblogs.com/zllwxm123/p/10541946.html
Copyright © 2011-2022 走看看