省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本。现请你编写程序,计算出全省畅通需要的最低成本。
行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数)。为简单起见,村庄从1到M编号。当N为0时,全部输入结束,相应的结果不要输出。
3 3 1 2 1 1 3 2 2 3 4 1 3 2 3 2 0 100
3?
题意:
题解:先把数据按成本从小到大排序,再判断是否成环,不成环就一条边一条边的加,最后判断是不是只有一颗树,如果是就把成本输出,不是就输出?
#include<iostream> #include<algorithm> using namespace std; int set[105]; struct node{ int x; int y; int cost; }road[10005]; //成本排序 int cmp(node a,node b){ return a.cost<b.cost; } int find(int x){ int r=x; while(set[r]!=r) r=set[r]; return r; } int merge(int a,int b){ a=find(a); b=find(b); if(a!=b){ set[b]=a; return 1; } else return 0; } void Init_set(){ for(int i=0;i<105;i++) set[i]=i; } int main(){ int n; int m; while(cin>>n>>m,n){ Init_set(); for(int i=0;i<n;i++) scanf("%d%d%d",&road[i].x,&road[i].y,&road[i].cost); sort(road,road+n,cmp); int sum=0; //成本 for(int i=0;i<n;i++) if(merge(road[i].x,road[i].y)) sum+=road[i].cost; int keep=0; //1~m都在一个集合中 for(int i=1;i<=m;i++) if(set[i]==i) keep++; if(keep>1) cout<<"?"<<endl; else cout<<sum<<endl; } }