• bzoj1050 并查集乱搞


    impossible打错。。

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 #include<algorithm>
     5 #define rep(i,l,r) for(int i=l;i<r;i++)
     6 #define clr(a,x) memset(a,x,sizeof(a))
     7 using namespace std;
     8 struct edge{
     9     int q,z,v;
    10     void read(){
    11         scanf("%d%d%d",&q,&z,&v);
    12     }
    13     bool operator<(const edge &e)const{
    14         return v<e.v;
    15     }
    16 };
    17 const int maxn=505,maxm=5005,inf=0x7fffffff;
    18 edge e[maxm];
    19 int n,m,fa[maxn],mx[maxn],mn[maxn];
    20 int find(int a)
    21 {
    22     return fa[a]==a?a:fa[a]=find(fa[a]);
    23 }
    24 int gcd(int a,int b)
    25 {
    26     return b==0?a:gcd(b,a%b);
    27 }
    28 int main()
    29 {
    30     cin>>n>>m;
    31     rep(i,0,m) e[i].read();
    32     int s,t,ansmax=-1,ansmin=-1;
    33     cin>>s>>t;
    34     sort(e,e+m);
    35     rep(i,0,m){
    36         rep(j,1,n+1) fa[j]=j;
    37         int mx,mn=e[i].v;
    38         rep(j,i,m){
    39             int a=find(e[j].q),b=find(e[j].z);
    40             if(a!=b){
    41                 mx=e[j].v;
    42                 fa[a]=b;
    43             }
    44             if(find(s)==find(t)){
    45                 if(ansmax==-1||mx*1.0/mn<ansmax*1.0/ansmin)
    46                 {
    47                     ansmax=mx;
    48                     ansmin=mn;
    49                 }     
    50                 break;
    51             }
    52         }
    53     }
    54     if(ansmax==-1) printf("IMPOSSIBLE");
    55     else{
    56         int gc=gcd(ansmax,ansmin);
    57         if(gc==ansmin) printf("%d",ansmax/ansmin);
    58         else printf("%d/%d",ansmax/gc,ansmin/gc);
    59     }
    60     return 0;
    61 }
    View Code

    1050: [HAOI2006]旅行comf

    Time Limit: 10 Sec  Memory Limit: 162 MB
    Submit: 1809  Solved: 924
    [Submit][Status][Discuss]

    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

     
    [Submit][Status][Discuss]
  • 相关阅读:
    CPU、io、mem之间的关系
    SSH交互式脚本StrictHostKeyChecking选项 benchmode=yes
    Linux学习笔记:fuser和lsof
    /proc/sys/kernel/sysrq /proc/sysrq-trigger----强制重启/触发器
    Android UI学习
    Android之TabHost布局(转)
    android AsyncTask介绍(转)
    android:imeOptions属性(转)
    Android:dimen尺寸资源文件的使用(转)
    解决Android解析图片的OOM问题!!!(转)
  • 原文地址:https://www.cnblogs.com/chensiang/p/4617173.html
Copyright © 2020-2023  润新知