HDU 1863
題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1863
暢通工程
Problem Description
省政府“暢通工程”的目標(biāo)是使全省任何兩個(gè)村莊間都可以實(shí)現(xiàn)公路交通(但不一定有直接的公路相連,只要能間接通過(guò)公路可達(dá)即可)。經(jīng)過(guò)調(diào)查評(píng)估,得到的統(tǒng)計(jì)表中列出了有可能建設(shè)公路的若干條道路的成本。現(xiàn)請(qǐng)你編寫程序,計(jì)算出全省暢通需要的最低成本。
?
?
Input
測(cè)試輸入包含若干測(cè)試用例。每個(gè)測(cè)試用例的第1行給出評(píng)估的道路條數(shù) N、村莊數(shù)目M ( < 100 );隨后的 N?
行對(duì)應(yīng)村莊間道路的成本,每行給出一對(duì)正整數(shù),分別是兩個(gè)村莊的編號(hào),以及此兩村莊間道路的成本(也是正整數(shù))。為簡(jiǎn)單起見(jiàn),村莊從1到M編號(hào)。當(dāng)N為0時(shí),全部輸入結(jié)束,相應(yīng)的結(jié)果不要輸出。
?
?
Output
對(duì)每個(gè)測(cè)試用例,在1行里輸出全省暢通需要的最低成本。若統(tǒng)計(jì)數(shù)據(jù)不足以保證暢通,則輸出“?”。
?
?
Sample Input
?3 3
1 2 1
1 3 2
2 3 4
1 3
2 3 2
0 100
?
?
Sample Output
?3
?
思路:最小生成樹(shù),Kruskal算法。
#include<iostream> #include<cstring> #include<queue> #include<cstdio> #include<algorithm> #define ll long long using namespace std; int pre[1000000]; int find(int x) {int r=x;while(pre[r]!=r)r=pre[r];return r; } int join(int x,int y) {int fx=find(x),fy=find(y);if(fx!=fy)pre[fx]=fy; } struct stu{int x,y,z; }stu1[1000]; bool cmp(stu a,stu b)//按權(quán)值排序 {return a.z<b.z; } int main() {int n,m;while(scanf("%d %d",&n,&m)!=EOF)//n是道路條數(shù) {if(n==0) break;for(int i=1;i<=m;i++)//注意i<=m {pre[i]=i;}for(int i=1;i<=n;i++)scanf("%d %d %d",&stu1[i].x,&stu1[i].y,&stu1[i].z);sort(stu1+1,stu1+n,cmp);//按z從小到大排序,從1開(kāi)始排序int sum=0;//成本 int r=1;//連接村莊個(gè)數(shù) for(int i=1;i<=n;i++)//對(duì)每條路連接的兩個(gè)村莊進(jìn)行判斷,如果兩個(gè)村莊已經(jīng)連接過(guò),不進(jìn)行處理,如果兩個(gè)村莊還沒(méi)連接,則將其連接。 {if(find(stu1[i].x)!=find(stu1[i].y)){join(stu1[i].x,stu1[i].y);sum=sum+stu1[i].z;r++;}if(r==m)//全部連接則跳出循環(huán) break; }if(r==m)//遍歷完每一條路也不一定全部連接,路可能不夠 printf("%d\n",sum); else puts("?"); }return 0; }?
總結(jié)
- 上一篇: vue安装node-sass错误
- 下一篇: 51单片机基础——串口通信字符串控制流水