标签:
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