#include<bits/stdc++.h>
#define Max 0x3f3f3f3f
using namespace std;
void prim(int **Map, int *disp, int &sumv, int n, int start);
int main()
{
int n;
cin>>n;
int **Map = new int*[n];
for(int i = 0; i < n; i++)
Map[i] = new int[n];
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
{
cin>>Map[i][j];
if(i != j && Map[i][j] == 0)
Map[i][j] = Max;
}
int s;
cin>>s;
int *disp = new int[n];
int sumv = 0;
prim(Map, disp, sumv, n, s);
cout<<"遍历所有节点的最小代价是:"<<sumv<<endl;
}
void prim(int **Map, int *disp, int &sumv, int n, int start)
{
int s = start - 1;
int *v = new int[n];
for(int i = 0; i < n; i++)
{
disp[i] = Map[s][i];
v[i] = 0;
}
v[s] = 1;
int temp;
int mini;
for(int i = 1; i < n; i++)
{
temp = Max;
for(int j = 0; j < n; j++)
{
if(!v[j] && disp[j] < temp)
{
temp = disp[j];
mini = j;
}
}
v[mini] = 1;
if(temp < Max)
sumv += temp;
for(int j = 0; j < n; j++)
{
if(!v[j] && disp[j] > Map[mini][j])
disp[j] = Map[mini][j]; ///区别于Dijkstra
}
}
}
08-03
08-03