題意:
多組輸入n,m,當n為0退出人輸入,n是道路數目,m是村莊總數,隨後n行,每行輸入三個數兩個村莊的編號,以及連線這兩個村莊的費用。
對每一組資料輸出暢通工程的最低費用,如果不能暢通就輸出「?」(不包括雙引號)
一道是fjut的鏈結,另外一道是hdu的
思路:其實這道題就是一道排序+並查集題,將每條路的費用進行排序然後依次合併,然後費用增加,當n中情況都試過了,再來乙個迴圈判斷是否全部連線。
好啦,我們來看ac**吧:
#include#include#include
#include
using
namespace
std;
int fa[105
];struct node//
定義這個結構體,a代表的是乙個村莊的編號,b代表的是另乙個村莊的編號,cost顧名思義
;int find(int
x)
returnx;}
bool cmp(node x,node y)//
cmp排序
int main(void
) sort(cp+1,cp+n+1,cmp);//
排序 for(int i=1;i<=n;i++)//
這個迴圈開始處理費用
}int k=find(1
);
int flag=1
;
for(int i=1;i<=m;i++)//
這個迴圈檢查是否村子都連線
}if(flag)
cout
else
cout
<<'?'
<}return0;
}
小結一下:這道題也算一道模版題吧,只不過可能開始有點難想,為什麼要對費用排序,騎士想通了就覺得很簡單,sort的自定義排序我也學了一波還是挺好用的,cmp的用法,待會我會另外寫一篇部落格,以供大家學習。
並查集入門題(暢通工程)
某省調查城鎮交通狀況,得到現有城鎮道路統計表,表中列出了每條道路直接連通的城鎮。省 暢通工程 的目標是使全省任何兩個城鎮間都可以實現交通 但不一定有直接的道路相連,只要互相間接通過道路可達即可 問最少還需要建設多少條道路?input測試輸入包含若干測試用例。每個測試用例的第1行給出兩個正整數,分別是...
並查集 暢通工程
problem description 某省調查城鎮交通狀況,得到現有城鎮道路統計表,表中列出了每條道路直接連通的城鎮。省 暢通工程 的目標是使全省任何兩個城鎮間都可以實現交通 但不一定有直接的道路相連,只要互相間接通過道路可達即可 問最少還需要建設多少條道路?input 測試輸入包含若干測試用例。...
並查集(暢通工程)
某省調查城鎮交通狀況,得到現有城鎮道路統計表,表中列出了每條道路直接連通的城鎮。省 暢通工程 的目標是使全省任何兩個城鎮間都可以實現交通 但不一定有直接的道路相連,只要互相間接通過道路可達即可 問最少還需要建設多少條道路?input 測試輸入包含若干測試用例。每個測試用例的第1行給出兩個正整數,分別...