bzoj 1050 codevs1001 舒適的路線[並查集]

1001 舒適的路線 2006年
時間限制: 2 s
空間限制: 128000 KB
題目等級 : 鑽石 Diamond
題解
題目描述 Description
Z小鎮是一個景色宜人的地方,吸引來自各地的觀光客來此旅遊觀光。
Z小鎮附近共有
N[1,500]個景點(編號爲1,2,3,…,N),這些景點被M[0,5000]條道路連接着,所有道路都是雙向的,兩個景點之間可能有多條道路。也許是爲了保護該地的旅遊資源,Z小鎮有個奇怪的規定,就是對於一條給定的公路Ri,任何在該公路上行駛的車輛速度必須爲Vi。頻繁的改變速度使得遊客們很不舒服,因此大家從一個景點前往另一個景點的時候,都希望選擇行使過程中最大速度和最小速度的比儘可能小的路線,也就是所謂最舒適的路線。

輸入描述 Input Description
第一行包含兩個正整數,N和M。
接下來的M行每行包含三個正整數:x,y和v(1≤x,y≤N,0 最後一行包含兩個正整數s,t,表示想知道從景點s到景點t最大最小速度比最小的路徑。s和t不可能相同。

輸出描述 Output Description
如果景點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

數據範圍及提示 Data Size & Hint
N(1

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int maxn=2e4+5;
struct node
{
    int fin,sta,wor;
}roa[maxn*5];
int fa[maxn*2],n,m;
bool cmp(node x,node y)
{
    return x.wor>y.wor;
}
int lookfor(int u)
{
    return fa[u]=(fa[u]==u?u:lookfor(fa[u]));
}
void unio(int u,int v)
{
    int fu=lookfor(u),fv=lookfor(v);
    fa[fu]=fv;
}
void prin(int u)
{
    printf("%d",roa[u].wor);
    exit(0);
}
void work()
{
    for(int i=1;i<=m;i++){
        if(lookfor(roa[i].sta+n)==lookfor(fa[roa[i].fin+n]))
            prin(i);
        if(lookfor(roa[i].sta)==lookfor(roa[i].fin))
            prin(i);
        unio(roa[i].sta,roa[i].fin+n);
        unio(roa[i].fin,roa[i].sta+n);
    }
    printf("0");
}
void init()
{
    scanf("%d %d",&n,&m);
    for(int i=1;i<=2*n;i++)fa[i]=i;
    for(int i=1;i<=m;i++)
        scanf("%d %d %d",&roa[i].fin,&roa[i].sta,&roa[i].wor);
    sort(roa+1,roa+m+1,cmp);
}
int main()
{
    freopen("codevs1069.in","r",stdin);
    freopen("codevs1069.out","w",stdout);
    init();
    work();
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章