#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
const int N = 510;
int dis[N], g[N][N], pre[N];
bool st[N];
int result = 0;
bool Prim(int n)
{
memset(dis, inf, sizeof(dis));
dis[1] = 0;
int cot = 0;
for(int i = 0; i<n; i++)
{
int t = -1;
for(int j =1; j<=n; j++)
if(!st[j] && (dis[t] > dis[j] || t == -1))
t = j;
if(dis[t] == inf) return false;
result += dis[t];
st[t] = true;
cot++;
for(int j=1; j<= n; j++)
{
if(dis[j] > g[t][j] && !st[j])
{
dis[j] = g[t][j];
pre[j] = t;
}
}
}
//cout<<cot<<endl;
if(cot == n) return true;
return false;
}
void printPath(int n)
{
for(int i =n; i>1; i--)
{
cout<<i<<" <---> "<<pre[i]<<' '<<endl;
}
}
int main()
{
int n, m;
cin>>n>>m;
memset(g, inf, sizeof(g));
while (m -- ){
int a, b, w;
cin>>a>>b>>w;
g[a][b] = min(g[a][b], w);
g[b][a] = g[a][b];
}
if( Prim(n))
cout<<result<<endl;
else cout<<"impossible"<<endl;
// printPath(n);
return 0;
}
ACWING基础算法——带边权和与路径打印的Prim算法
最新推荐文章于 2022-11-10 02:31:31 发布