畅通工程系列

来源:互联网 发布:淘宝评论怎么没有了 编辑:程序博客网 时间:2024/05/21 19:48

对于这题,现在还是有点蒙。

不过第二题把条件转换成:若道路已修建,则费用为0 ,剩下的就是查找最小生成树的问题 瞬间思路就清晰了。

感觉还是最小生成树没有掌握好。

代码如下:

#include <iostream>
#include <algorithm>
using namespace std;


int pre[105];
int cost[105];


struct node{
    int s;
    int e;
    int w;
    int f;
}nod[5000];


void make_set(int m){
    int i;
    for(i=1;i<=m;i++){
            pre[i]=i;
            cost[i]=0;
    }
}


int Find(int x){
    if (x != pre[x]){
        pre[x] = Find(pre[x]);
    }
    return pre[x];
}




int Merge(int x,int y){
    int a=Find(x);
    int b=Find(y);
    if(a==b)
        return 0;
        if(cost[a]>cost[b]){
            pre[b]=a;
            cost[a]+=cost[b];
        }
        else{
            if(cost[a]==cost[b])
                ++cost[b];
            pre[a]=b;
        }
    return 1;
}


bool cmp(node a,node b){
    return a.w<b.w;
}


int main()
{
    int N,i;
    int ans;
    while(cin>>N&&N){
        for(i=0;i<N*(N-1)/2;i++){
            cin>>nod[i].s>>nod[i].e>>nod[i].w>>nod[i].f;
            if(nod[i].f==1)
                nod[i].w=0;
        }
        sort(nod,nod+N*(N-1)/2,cmp);
        make_set(N);


        ans=0;
        for(i=0;i<N*(N-1)/2;++i){
            if(Merge(nod[i].s,nod[i].e)){
                ans+=nod[i].w;
            }
        }
        cout<<ans<<endl;
    }




    return 0;
}

0 0
原创粉丝点击