Prim求解最小生成树
AC代码:
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int MAX = 510;
int G[MAX][MAX],ans;
int good[110],dis[MAX],vis[MAX];
int n, m, k;
void init(){
for(int i=1; i<=n; i++){
for(int j=1; j<=n; j++){
if(i == j) G[i][j] = 0;
else G[i][j] = 0x3f3f3f3f;
}
}
}
int Prim(){
for(int i=1; i<=n; i++){
vis[i] = 0;
dis[i] = 0x3f3f3f3f;
}
int ans = 0;
dis[1] = 0;
for(int i=1; i<=n; i++){
int tmp = 0x3f3f3f3f, id = 0;
for(int j=1; j<=n; j++){
if(!vis[j] && tmp > dis[j]){
tmp = dis[j];
id = j;
}
}
if(tmp == 0x3f3f3f3f){
ans = -1;
break;
}
vis[id] = 1;
ans += tmp;
for(int j=1; j<=n; j++){
if(!vis[j] && dis[j] > G[id][j])
dis[j] = G[id][j];
}
}
return ans;
}
int main(){
int cas;
scanf("%d",&cas);
while(cas--){
scanf("%d%d%d",&n,&m,&k);
init();
for(int i=0; i<m; i++){
int u, v, c;
scanf("%d%d%d",&u,&v,&c);
if(G[u][v] > c)
G[u][v] = G[v][u] = c;
}
for(int i=0; i<k; i++){
int t;
scanf("%d",&t);
for(int j=1; j<=t; j++)
scanf("%d",&good[j]);
for(int x=2; x<=t; x++)
G[good[x]][good[x-1]] = G[good[x-1]][good[x]] = 0;
}
printf("%d\n",Prim());
}
return 0;
}