您的位置:首页 > 其它

hdu 1102 -Constructing Roads(最小生成树)

2013-04-15 21:29 363 查看
/* 基本的最小生成树问题 将已经存在的边重新建图权值为0,再prim就可以 这个题用prim来做还是比较简单的

*/

#include<cstdio>

#include<cstring>

#define INF 1000+10

int map[110][110],vis[110],low[110];

int prim(int n)

{

int ans=0;

for(int i = 0; i <= n; i++)

{

vis[i] = 0;

low[i] = map[1][i];

}

vis[1] = 1;

for(int i = 1; i <= n; i++)

{

int temp = INF,tp=-1;

for(int j = 1; j <= n; j++)

if(!vis[j]&&temp>low[j])

{

tp = j;

temp = low[j];

}

if(tp==-1) continue;

int k = tp;

vis[k] = 1;

ans += low[k];

for(int j = 1; j <= n; j++)

{

if(!vis[j]&&low[j]>map[k][j])

{

low[j] = map[k][j];

}

}

}

return ans;

}

int main()

{

int n,q,a,b;

while(scanf("%d",&n)==1)

{

memset(map,0,sizeof(map));

for(int i = 1; i <= n; i++)

for(int j = 1; j <= n; j++)

scanf("%d",&map[i][j]);

scanf("%d",&q);

while(q--)

{

scanf("%d%d",&a,&b);

map[a][b]=map[b][a]=0;

}

printf("%d\n",prim(n));

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: