• 【BZOJ1050】【枚举+并查集】旅行comf


    Description

    给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000)。给你两个顶点S和T,求一条路径,使得路径上最大边和最小边的比值最小。如果S和T之间没有路径,输出”IMPOSSIBLE”,否则输出这个比值,如果需要,表示成一个既约分数。 备注: 两个顶点之间可能有多条路径。

    Input

    第一行包含两个正整数,N和M。 下来的M行每行包含三个正整数:x,y和v。表示景点x到景点y之间有一条双向公路,车辆必须以速度v在该公路上行驶。 最后一行包含两个正整数s,t,表示想知道从景点s到景点t最大最小速度比最小的路径。s和t不可能相同。

    Output

    如果景点s到景点t没有路径,输出“IMPOSSIBLE”。否则输出一个数,表示最小的速度比。如果需要,输出一个既约分数。

    Sample Input

    【样例输入1】
    4 2
    1 2 1
    3 4 2
    1 4
    【样例输入2】
    3 3
    1 2 10
    1 2 5
    2 3 8
    1 3
    【样例输入3】
    3 2
    1 2 2
    2 3 4
    1 3

    Sample Output

    【样例输出1】
    IMPOSSIBLE
    【样例输出2】
    5/4
    【样例输出3】
    2

    HINT

    【数据范围】

    1<  N < = 500

    1 < = x, y < = N,0 < v < 30000,x ≠ y

    0 < M < =5000

    Source

    【分析】

    凑数题。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <algorithm>
     4 #include <cstring>
     5 #include <vector>
     6 #include <utility>
     7 #include <iomanip>
     8 #include <string>
     9 #include <cmath>
    10 #include <queue>
    11 #include <map>
    12 
    13 const int MAXN = 500 + 10; 
    14 const int MAXM = 5000 + 10; 
    15 using namespace std;
    16 struct EDGE{
    17        int u, v ,w;
    18        bool operator < (EDGE B)const{
    19             return w < B.w;
    20        }
    21 }edge[MAXM];
    22 int n, m, parent[MAXN];
    23 int s, t;
    24 
    25 int find(int x){return parent[x] < 0 ? x:parent[x] = find(parent[x]);}
    26 void merge(int x, int y){
    27      if (parent[x] > parent[y]){
    28         parent[y] += parent[x];
    29         parent[x] = y;
    30      }else{
    31         parent[x] += parent[y];
    32         parent[y] = x;
    33      }
    34 }
    35 void init(){
    36      scanf("%d%d", &n, &m);
    37      memset(parent, -1, sizeof(parent));
    38      for (int i = 1; i <= m; i++){
    39          scanf("%d%d%d", &edge[i].u, &edge[i].v, &edge[i].w);
    40      }
    41      scanf("%d%d", &s, &t);
    42      sort(edge + 1, edge + 1 + m);
    43 }
    44 int gcd(int a, int b){return b == 0? a:gcd(b, a % b);}
    45 void work(){
    46      int A = 30000, B = 1;
    47      //枚举边长最小的边 
    48      for (int i = 1; i <= m; i++){
    49          memset(parent, -1, sizeof(parent));
    50          int j;
    51          for (j = i; j <= m; j++){
    52              int u = edge[j].u, v = edge[j].v;
    53              u = find(u); v = find(v);
    54              if (u != v) merge(u, v);
    55              if (find(s) == find(t)) break;
    56          }
    57          if (j <= m){
    58             if (edge[i].w * A > edge[j].w * B){
    59                A = edge[j].w;
    60                B = edge[i].w;
    61             }
    62          }
    63      }
    64      if (A == 30000 && B == 1) {printf("IMPOSSIBLE
    ");return;}
    65      if (A % B == 0) printf("%d
    ", A / B);
    66      else printf("%d/%d", A / gcd(A, B), B / gcd(A, B));
    67 }
    68  
    69 int main(){
    70     int T;
    71     #ifdef LOCAL
    72     freopen("data.txt",  "r",  stdin);
    73     freopen("out.txt",  "w",  stdout); 
    74     #endif
    75     init();
    76     work();
    77     return 0;
    78 }
    View Code
  • 相关阅读:
    双USB墙壁电源插座面板....制作详解-电子产品世界论坛
    公共充电站?不用守着手机充电了 | 爱范儿
    公司简介-远能电气
    连接器|网络滤波连接器|电脑连接器|RJ45变压器-华联威电子有限公司
    自己动手做简单移动电源
    移动电源市场有多乱?
    聚合物电池_百度百科
    电芯:聚合物的一定比18650更好_移动电源_移动电源评测-中关村在线
    图文:充电宝租借自助机现身江城_新浪财经_新浪网
    不按时归还,信用会有“污点”_新浪浙江_新浪网
  • 原文地址:https://www.cnblogs.com/hoskey/p/4322157.html
Copyright © 2020-2023  润新知