题意:就是给了N个村庄,然后给你权值什么的 ,后面又给了一个数M,告诉你哪些路已经修好了,你就不用修了,最后问最小生成树,问需要修的最短的路。
思路:把已经修建好的路的权值设置为0,这样就加不进去了,剩下的套模板就好
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#include<iostream>
#include<algorithm>
#define maxn 1020
#define INF 0x3f3f3f3f
using namespace std;
int map[maxn][maxn];
int d[maxn];
bool vis[maxn];
int n,q;
void prim()
{
for(int i = 1; i <= n; i ++)
{
d[i] = map[1][i];
vis[i] = 0;
}
for(int i = 1; i <= n; i ++)
{
int minx = INF;
int now;
for(int j = 1; j <= n; j ++)
{
if(!vis[j] && minx > d[j])
{
now = j;
minx = d[j];
}
}
vis[now] = 1;
for(int k = 1; k <= n; k ++)
{
if(!vis[k] && d[k] > map[now][k])
d[k] = map[now][k];
}
}
int sum = 0;
for(int i = 1; i <= n; i ++)
sum += d[i];
printf("%d\n",sum);
}
int main()
{
scanf("%d",&n);
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= n; j ++)
{
scanf("%d",&map[i][j]);
//map[i][j] = map[j][i];
}
scanf("%d",&q);
int x,y;
while(q --)
{
scanf("%d%d",&x,&y);
map[x][y] = map[y][x] = 0;
}
prim();
return 0;
}