您的位置:首页 > 其它

题目1028:继续畅通工程

2014-03-12 18:29 225 查看
// 若道路已修建,则费用为0 ,剩下的就是查找最小生成树的问题。。。

#include<stdio.h>

#include<algorithm>

using namespace std;

#define N 1000

struct Edge{ // 边结构体

int a,b; // 边的两个顶点

int cost; // 权值

int f; // 道路修建状态,0表示未修建

bool operator < (const Edge &A) const{

return cost<A.cost;

}

}edge[6000];

int Tree
;

int findRoot(int x){ // 查找根结点

if(Tree[x]==-1) return x;

else{

int tmp=findRoot(Tree[x]);

Tree[x]=tmp;

return tmp;

}

}

int main()

{

int n;

while(scanf("%d",&n)!=EOF && n!=0){

for(int i=1;i<=n;i++) Tree[i]=-1;

for(int i=0;i<n*(n-1)/2;i++){

scanf("%d%d%d%d",&edge[i].a,&edge[i].b,&edge[i].cost,&edge[i].f);

if(edge[i].f==1) edge[i].cost=0; // 若道路已修建,则费用为0

}

sort(edge,edge+n*(n-1)/2);

int ans=0;

for(int i=0;i<n*(n-1)/2;i++){

int a=findRoot(edge[i].a);

int b=findRoot(edge[i].b);

if(a!=b){

Tree[a]=b;

ans+=edge[i].cost;

}

}

printf("%d\n",ans);

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: