您的位置:首页 > 其它

POJ - 2421 Constructing Roads【最小生成树】

2017-03-29 22:50 519 查看
题意:

给你n个城市,然后给出每个城市的距离。

再给你说已经有哪些城市已经连起来了。

剩下问你联通的最小修路代价是多少。

题解:

最小生成树。把连好的城市距离改成0就行了。

直接模板。

#include<iostream>
#include<queue>
#include<stdio.h>
#define ll long long

using namespace std;
const int maxn= 111;
int a[maxn][maxn];
int dis[maxn];
int n,m,x,y;
void prim(){
int i,j,k,mina;
bool f[maxn];
for(i=2;i<=n;++i){
f[i]=0;
dis[i]=a[1][i];
}
dis[1]=0;
f[1]=1;
for(i=1;i<=n-1;++i){
mina=9999999;
k=0;
for(j=1;j<=n;++j){
if(!f[j]&&dis[j]<mina){
mina=dis[j];
k=j;
}
}
if(k==0) return;
f[k]=1;
for(j=1;j<=n;++j){
if(!f[j]&&a[k][j]!=9999999&&dis[j]>a[k][j]){
dis[j]=a[k][j];
}
}
}
}

int main(){
while(~scanf("%d",&n)){
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
scanf("%d",&a[i][j]);
scanf("%d",&m);
while(m--){
scanf("%d %d",&x,&y);
a[x][y]=a[y][x]=0;
}
prim();
int ans=0;
for(int i=1;i<=n;++i)
ans+=dis[i];
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: