標籤:problems pac 圖片 模板題 for ring ref 分析 需要
#1097 : 最小產生樹一·Prim演算法時間限制:10000ms單點時限:1000ms記憶體限制:256MB描述
最近,小Hi很喜歡玩的一款遊戲類比城市開放出了新Mod,在這個Mod中,玩家可以擁有不止一個城市了!
但是,問題也接踵而來——小Hi現在手上擁有N座城市,且已知這N座城市中任意兩座城市之間建造道路所需要的費用,小Hi希望知道,最少花費多少就可以使得任意兩座城市都可以通過所建造的道路互相到達(假設有A、B、C三座城市,只需要在AB之間和BC之間建造道路,那麼AC之間也是可以通過這兩條道路連通的)。
提示:不知道為什麼Prim演算法和Dijstra演算法很像呢Σ(っ °Д °;)っ 。輸入
每個測試點(輸入檔案)有且僅有一組測試資料。
在一組測試資料中:
第1行為1個整數N,表示小Hi擁有的城市數量。
接下來的N行,為一個N*N的矩陣A,描述任意兩座城市之間建造道路所需要的費用,其中第i行第j個數為Aij,表示第i座城市和第j座城市之間建造道路所需要的費用。
對於100%的資料,滿足N<=10^3,對於任意i,滿足Aii=0,對於任意i, j滿足Aij=Aji, 0<Aij<10^4.
輸出
對於每組測試資料,輸出1個整數Ans,表示為了使任意兩座城市都可以通過所建造的道路互相到達至少需要的建造費用。
-
範例輸入
-
50 1005 6963 392 1182 1005 0 1599 4213 1451 6963 1599 0 9780 2789 392 4213 9780 0 5236 1182 1451 2789 5236 0
-
範例輸出
-
4178
分析:Prim演算法模板題,代碼跟dijkstra很像。
#include<cstdio>#include<cstring>#include<algorithm>#define INF 999999999using namespace std;int map[1002][1002];int vis[1002],d[1002],N;int prim(){ for(int i=0;i<=N;i++) {vis[i]=0;d[i]=INF;} d[1]=0; int ans=0; while(true) { int v=-1; for(int u=1;u<=N;u++) if(!vis[u]&&(v==-1||d[u]<d[v])) v=u; if(v==-1) break; vis[v]=1; ans+=d[v]; for(int u=1;u<=N;u++) d[u]=min(d[u],map[v][u]); } return ans;}int main(){ scanf("%d",&N); for(int i=1;i<=N;i++) for(int j=1;j<=N;j++) scanf("%d",&map[i][j]); printf("%d\n",prim()); return 0;}View Code
hihoCoder1097 (Prim演算法)