Codevs 2455 繁忙的都市

題目描述 Description
城市C是一個非常繁忙的大都市,城市中的道路十分的擁擠,於是市長決定對其中的道路進行改造。城市C的道路是這樣分佈的:城市中有n個交叉路口,有些交叉路口之間有道路相連,兩個交叉路口之間最多有一條道路相連接。這些道路是雙向的,且把所有的交叉路口直接或間接的連接起來了。每條道路都有一個分值,分值越小表示這個道路越繁忙,越需要進行改造。但是市政府的資金有限,市長希望進行改造的道路越少越好,於是他提出下面的要求:

1. 改造的那些道路能夠把所有的交叉路口直接或間接的連通起來。

2. 在滿足要求1的情況下,改造的道路儘量少。

3. 在滿足要求1、2的情況下,改造的那些道路中分值最大的道路分值儘量小。

任務:作爲市規劃局的你,應當作出最佳的決策,選擇那些道路應當被修建。

輸入描述 Input Description
第一行有兩個整數n,m表示城市有n個交叉路口,m條道路。接下來m行是對每條道路的描述,u, v, c表示交叉路口u和v之間有道路相連,分值爲c。(1≤n≤300,1≤c≤10000)

輸出描述 Output Description
兩個整數s, max,表示你選出了幾條道路,分值最大的那條道路的分值是多少。


雖然是一道省選題,不過是一道很水的省選題啊..
裸的Kruskal,把計算權值之和換成記錄最大的邊就行了
Ac代碼:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,father[301];
struct mst{
    int u,v,c;
}e[10001];
int find(int x)//找根,路徑壓縮
{
    if(father[x]!=x) father[x]=find(father[x]);
    return father[x];
}
void unionn(int x,int y)
{
    x=find(x),y=find(y);
    father[y]=x;
}
bool cmp(mst a,mst b)
{
    return a.c<b.c;
}
int Kruskal()//返回的就是最小生成樹裏最大的邊
{
    int k=0,ans=0;
    for(int i=1;i<=m;i++)//感謝ym學姐博客上的對拍,終於發現我把這個循環的m打成n了!
    {
        if(find(e[i].u)!=find(e[i].v))
        {
            unionn(e[i].u,e[i].v);
            ans=max(ans,e[i].c);//max()函數在algorithm裏
            k++;
        }
        if(k==n-1) break;
    }
    //cout<<k<<endl;
    return ans;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) father[i]=i;
    for(int i=1;i<=m;i++)
        scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].c);
    sort(e+1,e+m+1,cmp);
    cout<<n-1<<" "<<Kruskal()<<endl;
}
發佈了23 篇原創文章 · 獲贊 8 · 訪問量 5247
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章