POJ T2421 Constructing Roads
题解:
给出点与点之间的距离矩阵(maps数组可以不初始化),再给q组已经建好的路,将这些路的距离再标记为0即可。
代码
#include<cstdio>
#include<algorithm>
#define INF 0x3f3f3f3f
#define maxn 105
using namespace std;
int n,q,sum,dis[maxn];
int map[maxn][maxn];
bool vis[maxn];
void init(){
sum = 0;
for(int i = 1;i <= n; i++){
dis[i] = INF;
vis[i] = false;
for(int j = 1; j <= i ;j++)
i == j ? map[i][j] = 0 : map[i][j] = map[j][i] = INF;
}
}
void Prim(int s){
dis[s] = 0;
for(int i = 1; i <= n ; i++){
int p = -1 , minn = INF;
for(int j = 1; j <= n ; j++){
if(!vis[j] && minn > dis[j]){
p = j;
minn = dis[j];
}
}
vis[p] = true;
sum += dis[p];
for(int j = 1; j <= n ; j++){
if(!vis[j] && dis[j] > map[p][j])
dis[j] = map[p][j];
}
}
}
int main(){
int u,v;
scanf("%d",&n);
init();
for(int i = 1; i <= n ; i++)
for(int j = 1; j <= n; j++)
scanf("%d",&map[i][j]);
scanf("%d",&q);
for(int i = 1; i <= q; i++){
scanf("%d%d",&u,&v);
map[u][v] = map[v][u] = 0; #已建好的路标记为零
}
Prim(1);
printf("%d\n",sum);
return 0;
}