题目大意就是给你一个n,随后是一个n×n的矩阵mp,mp[i][j]代表i点到j点的距离。然后给一个q,接下来的q行代表a村庄和b村庄已经建好路了。
思路很简单,将矩阵读入之后,再根据a,b将mp[a][b]和mp[b][a]赋值为0,随后用prim求解就可以。
//
// main.cpp
// L
//
// Created by LucienShui on 2017/5/11.
// Copyright © 2017年 LucienShui. All rights reserved.
//
#include <iostream>
#include <algorithm>
#include <set>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <cstdio>
#include <cstring>
#define memset(a,b) memset(a,b,sizeof(a))
using namespace std;
const int maxn = 100+7;
int mp[maxn][maxn],dist[maxn],n,q,a,b;
bool vis[maxn];
inline void prim() {
int index,cur=1,sum=0;
for(int i=1 ; i<=n ; i++) dist[i] = mp[cur][i];
memset(vis,false);
vis[cur]=true;
for(int cnt=1 ; cnt<n ; cnt++) {
int minn = 1008611;
for(int i=2 ; i<=n ; i++) {
if(!vis[i]&&dist[i]<minn) {
index = i;
minn = dist[i];
}
}
vis[index] = true;
sum += dist[index];
for(int i=2 ; i<=n ; i++) {
if(!vis[i]&&mp[index][i]<dist[i]) {
dist[i] = mp[index][i];
}
}
}
printf("%d\n",sum);
}
inline void read() {
for(int i=1 ; i<=n ; i++) {
for(int j=1 ; j<=n ; j++) {
scanf("%d",mp[i]+j);
}
}
scanf("%d",&q);
while(q--) {
scanf("%d%d",&a,&b);
mp[a][b]=mp[b][a]=0;
}
}
int main() {
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif
while(~scanf("%d",&n)) {
read();
prim();
}
return 0;
}