• BNUOJ 6023 畅通工程续


    畅通工程续

    Time Limit: 1000ms
    Memory Limit: 32768KB
    This problem will be judged on HDU. Original ID: 1874
    64-bit integer IO format: %I64d      Java class name: Main
     
    某省自从实行了很多年的畅通工程计划后,终于修建了很多路。不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多。这让行人很困扰。

    现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。
     

    Input

    本题目包含多组数据,请处理到文件结束。
    每组数据第一行包含两个正整数N和M(0<N<200,0<M<1000),分别代表现有城镇的数目和已修建的道路的数目。城镇分别以0~N-1编号。
    接下来是M行道路信息。每一行有三个整数A,B,X(0<=A,B<N,A!=B,0<X<10000),表示城镇A和城镇B之间有一条长度为X的双向道路。
    再接下一行有两个整数S,T(0<=S,T<N),分别代表起点和终点。
     

    Output

    对于每组数据,请在一行里输出最短需要行走的距离。如果不存在从S到T的路线,就输出-1.
     

    Sample Input

    3 3
    0 1 1
    0 2 3
    1 2 1
    0 2
    3 1
    0 1 1
    1 2

    Sample Output

    2
    -1

    Source

     
    解题:很水的题目!纯粹是为了学习下Dijkstra算法的优先队列优化。。哎 错了好多次!我逗逼了。。。
     
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cmath>
     5 #include <algorithm>
     6 #include <climits>
     7 #include <vector>
     8 #include <queue>
     9 #include <cstdlib>
    10 #include <string>
    11 #include <set>
    12 #include <stack>
    13 #define LL long long
    14 #define pii pair<int,int>
    15 #define INF 0x3f3f3f3f
    16 using namespace std;
    17 const int maxn = 210;
    18 int n,m,mp[maxn][maxn],d[maxn],s,t;
    19 bool done[maxn];
    20 priority_queue< pii,vector< pii > ,greater< pii > >q;
    21 void dijkstra(int s){
    22     while(!q.empty()) q.pop();
    23     int i,j,u,v;
    24     for(i = 0; i < n; i++){
    25         done[i] = false;
    26         d[i] = INF;
    27     }
    28     d[s] = 0;
    29     q.push(make_pair(d[s],s));
    30     while(!q.empty()){
    31         u = q.top().second;
    32         q.pop();
    33         if(done[u]) continue;
    34         done[u] = true;
    35         for(v = 0; v < n; v++){
    36             if(d[u] < INF && mp[u][v] < INF && d[v] > d[u]+mp[u][v]){
    37                 d[v] = d[u]+mp[u][v];
    38                 q.push(make_pair(d[v],v));
    39             }
    40         }
    41         if(done[t]) return;
    42     }
    43 }
    44 int main() {
    45     int i,j,u,v,w;
    46     while(~scanf("%d %d",&n,&m)){
    47         for(i = 0; i < n; i++){
    48             for(j = 0; j < n; j++)
    49                 mp[i][j] = INF;
    50         }
    51         for(i = 0; i < m; i++){
    52             scanf("%d %d %d",&u,&v,&w);
    53             if(mp[u][v] > w) mp[u][v] = mp[v][u] = w;
    54         }
    55         scanf("%d %d",&s,&t);
    56         dijkstra(s);
    57         printf("%d
    ",d[t] == INF?-1:d[t]);
    58     }
    59     return 0;
    60 }
    View Code
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cmath>
     5 #include <algorithm>
     6 #include <climits>
     7 #include <vector>
     8 #include <queue>
     9 #include <cstdlib>
    10 #include <string>
    11 #include <set>
    12 #include <stack>
    13 #define LL long long
    14 #define INF 0x3f3f3f3f
    15 using namespace std;
    16 const int maxn = 210;
    17 int n,m,s,t,d[maxn],mp[maxn][maxn];
    18 bool done[maxn];
    19 void spfa(int s){
    20     int i,j,u,v;
    21     queue<int>q;
    22     for(i = 0; i < n; i++)
    23         d[i] = INF;
    24     memset(done,false,sizeof(done));
    25     d[s] = 0;
    26     q.push(s);
    27     done[s] = true;
    28     while(!q.empty()){
    29         u = q.front();
    30         q.pop();
    31         done[u] = false;
    32         for(v = 0; v < n; v++){
    33             if(d[v] > d[u]+mp[u][v]){
    34                 d[v] = d[u]+mp[u][v];
    35                 if(!done[v]){
    36                     done[v] = true;
    37                     q.push(v);
    38                 }
    39             }
    40         }
    41     }
    42 }
    43 int main(){
    44     int i,j,u,v,w;
    45     while(~scanf("%d %d",&n,&m)){
    46         for(i = 0; i < n; i++)
    47             for(j = 0; j < n; j++)
    48             mp[i][j] = INF;
    49         for(i = 0; i < m; i++){
    50             scanf("%d %d %d",&u,&v,&w);
    51             if(mp[u][v] > w) mp[u][v] = mp[v][u] = w;
    52         }
    53         scanf("%d %d",&s,&t);
    54         spfa(s);
    55         printf("%d
    ",d[t] == INF?-1:d[t]);
    56     }
    57     return 0;
    58 }
    View Code
  • 相关阅读:
    【leetcode】236. 二叉树的最近公共祖先
    【leetcode】230. 二叉搜索树中第K小的元素
    【leetcode】309. 最佳买卖股票时机含冷冻期
    【leetcode】306. 累加数
    【leetcode】304. 二维区域和检索
    spring-framework源码编译及导入
    Java8-函数式接口理解及测试
    Mac编译RocketMQ 4.1.0
    首记
    JS表单验证
  • 原文地址:https://www.cnblogs.com/crackpotisback/p/3905777.html
Copyright © 2020-2023  润新知