标签:
Constructing Roads179
题解:建路使各个村庄都连通N个村庄,
0 990 692 ····························1—(0)—1,1——(990)——2,1——(692)——3
990 0 179 ························· 2——(990)——1, 2——(0)————2,2———(179)——3
692 179 0·································3——(692)——1,3——(179)——2,3———(0)———3
1 ·························已经建好的路数
1 2 ···························路(可以将建好的路之间的距离定为0)
采用prime 算法
代码:
/// #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> using namespace std; const int maxx=105; const int inf=0x3f3f3f3f; int n,ans; int book[maxx];///记录 int e[maxx][maxx]; int dis[maxx];///存放最短距离 ///prime算法核心 void prime () { for(int i=1; i<=n; i++)///看似1-其他点的距离 { dis[i]=e[1][i]; book[i]=0; } book[1]=1; dis[1]=0; int u; for(int i=1; i<=n; i++) { int minn=inf; for(int j=1; j<=n; j++) if(!book[j]&&dis[j]<minn) { minn=dis[j]; u=j; } if(minn==inf) break; book[u]=1; ans+=dis[u]; for(int v=1; v<=n; v++) { if(!book[v]&&dis[v]>e[u][v]) dis[v]=e[u][v]; } } } int main() { while(~scanf("%d",&n)) { for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) scanf("%d",&e[i][j]); int q; scanf("%d",&q); while(q--) { int a,b; scanf("%d %d",&a,&b); e[a][b]=e[b][a]=0;///将已经建好的路之间的距离定为0 } ans=0; prime(); printf("%d\n",ans); } return 0; }
HDU 1102 Constructing Roads (最小生成树)
标签:
原文地址:http://blog.csdn.net/jingttkx/article/details/51366626