zoukankan      html  css  js  c++  java
  • 1002

    1002 - Country Roads

    I am going to my home. There are many cities and many bi-directional roads between them. The cities are numbered from 0 to n-1 and each road has a cost. There are m roads. You are given the number of my city t where I belong. Now from each city you have to find the minimum cost to go to my city. The cost is defined by the cost of the maximum road you have used to go to my city.

     

    For example, in the above picture, if we want to go from 0 to 4, then we can choose

    1)      0 - 1 - 4 which costs 8, as 8 (1 - 4) is the maximum road we used

    2)      0 - 2 - 4 which costs 9, as 9 (0 - 2) is the maximum road we used

    3)      0 - 3 - 4 which costs 7, as 7 (3 - 4) is the maximum road we used

    So, our result is 7, as we can use 0 - 3 - 4.

    Input

    Input starts with an integer T (≤ 20), denoting the number of test cases.

    Each case starts with a blank line and two integers n (1 ≤ n ≤ 500) and m (0 ≤ m ≤ 16000). The next m lines, each will contain three integers u, v, w (0 ≤ u, v < n, u ≠ v, 1 ≤ w ≤ 20000) indicating that there is a road between u and v with cost w. Then there will be a single integer t (0 ≤ t < n). There can be multiple roads between two cities.

    Output

    For each case, print the case number first. Then for all the cities (from 0 to n-1) you have to print the cost. If there is no such path, print 'Impossible'.

    Sample Input

    Output for Sample Input

    2

    5 6

    0 1 5

    0 1 4

    2 1 3

    3 0 7

    3 4 6

    3 1 8

    1

    5 4

    0 1 5

    0 1 4

    2 1 3

    3 4 7

    1

    Case 1:

    4

    0

    3

    7

    7

    Case 2:

    4

    0

    3

    Impossible

    Impossible

    Note

    Dataset is huge, user faster I/O methods.


    PROBLEM SETTER: JANE ALAM JAN
    思路:最小生成树变形。
    由于要找一条路径从出发点到另一点的路径中最大边的值最小。
    根据最小生成树的算法,我们在算最小生成树的时候优先选择到集合路径最小的点加入集合,并把边加上,因为我们要选的从出发点到另一点的路径中最大边的值最小。
    所以由最小生成树的优先可以知道我们所选的边是当前最小的,,所以满足要保证路径上的边都是最优的,并且更新的时候为  d[vec[l][i].to]=max(vec[l][i].cost,d[l]);
    这就保证了,到当前的点的路的最大值,这样每次选最大值最小的。
     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #include<iostream>
     4 #include<algorithm>
     5 #include<queue>
     6 #include<vector>
     7 #include<string.h>
     8 void prim(int n,int cnt);
     9 int ma[600][600];
    10 using namespace std;
    11 typedef long long LL;
    12 typedef struct pp {
    13     int from;
    14     int to;
    15     int cost;
    16 } ss ;
    17 int d[600];
    18 vector<ss>vec[600];
    19 int main(void) {
    20     int i,j,k,p,q;
    21     int x,y,z;
    22     int s;
    23     scanf("%d",&k);
    24     for(s=1; s<=k; s++) {
    25         for(i=0; i<600; i++) {
    26             vec[i].clear();
    27             for(j=0; j<600; j++) {
    28                 ma[i][j]=1e9;
    29 
    30             }
    31         }
    32         scanf("%d %d",&p,&q);
    33         while(q--) {
    34             scanf("%d %d %d",&x,&y,&z);
    35             if(ma[x][y]>z) {
    36                 ma[y][x]=z;ma[x][y]=z;
    37             }
    38         }
    39         for(i=0; i<600; i++) {
    40             for(j=0; j<600; j++) {
    41                 if(ma[i][j]!=1e9) {
    42                     ss dd;
    43                     dd.cost=ma[i][j];
    44                     dd.from=i;
    45                     dd.to=j;
    46                     vec[dd.from].push_back(dd);
    47                 }
    48             }
    49         }
    50         int u;
    51         cin>>u;
    52         prim(u,p-1);
    53         printf("Case %d:
    ",s);
    54         for(i=0; i<p; i++)
    55             if(d[i]!=1e9)printf("%d
    ",d[i]);
    56             else printf("Impossible
    ");
    57     }
    58     return 0;
    59 
    60 }
    61 void prim(int n,int cnt) {
    62     fill(d,d+600,1e9);
    63     d[n]=0;
    64     queue<int>que;bool flag[600];
    65     memset(flag,0,sizeof(flag));
    66     while(true)
    67     {
    68         int l=-1;int i;
    69         for(i=0;i<=cnt;i++)
    70         {
    71             if((l==-1||d[i]<d[l])&&!flag[i])
    72             {
    73                 l=i;
    74             }
    75         }
    76         if(l==-1||d[l]==1e9)
    77         {
    78             break;
    79         }
    80         flag[l]=true;
    81         for(i=0;i<vec[l].size();i++)
    82         {
    83             if(d[vec[l][i].to]>vec[l][i].cost)
    84             {
    85                 d[vec[l][i].to]=max(vec[l][i].cost,d[l]);
    86             }
    87         }
    88     }
    89 }
    油!油!you@
  • 相关阅读:
    活用 %取余 用于变量循环
    jquery滚动条固定在某一位置
    jquary中各种相似操作介绍
    jquary中滚动条滚动到底部
    JSON到字符串之间的解析
    ecshop删去版权等信息
    分享代码和网页地图
    ecshop版权的修改,头部,底部
    ECSHOP中transport.js和jquery的冲突的简单解决办法
    从Eclipse迁移到Android Studio碰到的问题记录
  • 原文地址:https://www.cnblogs.com/zzuli2sjy/p/5285919.html
Copyright © 2011-2022 走看看