![](https://img2020.cnblogs.com/i-beta/1955514/202003/1955514-20200306115459414-2031871095.png)
输入样例1:
6 15
1 2 5
1 3 3
1 4 7
1 5 4
1 6 2
2 3 4
2 4 6
2 5 2
2 6 6
3 4 6
3 5 1
3 6 1
4 5 10
4 6 8
5 6 3
输出样例1:
12
输入样例2:
5 4
1 2 1
2 3 2
3 1 3
4 5 4
输出样例2:
Impossible
思路:用prim算法求最小生成树
#include <stdio.h>
#include <string.h>
#define MaxVex 1000
#define INF 0x3f3f3f3f
int Nv,Ne;
int G[MaxVex+1][MaxVex+1];
int visit[MaxVex+1]= {0};
int LowCost[MaxVex+1]= {0};
void CreateGraph() {//用邻接矩阵初始化
scanf("%d %d",&Nv,&Ne);
int i,j;
memset(G,INF,sizeof(G));
for(i=1; i<=Nv; i++) {
G[i][i]=0;
}
int v1,v2,cost;
for(i=0; i<Ne; i++) {
scanf("%d %d %d",&v1,&v2,&cost);
G[v1][v2]=cost;
G[v2][v1]=cost;
}
}
int FindMin() {
int min=INF;
int i,pos=0;
for(i=1; i<=Nv; i++) {
if(!visit[i]&&LowCost[i]<min) {
min=LowCost[i];
pos=i;
}
}
return pos;
}
int Prim() {
int i,j,sum=0;
for(i=1; i<=Nv; i++) {//从节点1开始
if(!visit[i])
LowCost[i]=G[1][i];
}
visit[1]=1;
for(i=2; i<=Nv; i++) {
int k=FindMin();
if(k) {
visit[k]=1;
sum+=LowCost[k];
for(j=1; j<=Nv; j++) {
if(!visit[j]&&G[k][j]<LowCost[j])
LowCost[j]=G[k][j];
}
} else return -1;
}
return sum;
}
int main() {
CreateGraph();
int sum=Prim();
if(sum==-1)
printf("Impossible");
else
printf("%d",sum);
}