- 专题九 最小生成树
prim
- @ 2025-8-16 11:27:35
#include<bits/stdc++.h>
using namespace std;
const int N = 510;
int g[N][N];
int dist[N], st[N], pre[N];
int n, m;
void prim()
{
memset(dist, 0x3f, sizeof dist);
int res = 0;
dist[1] = 0;
for(int i = 0; i < n; i++)
{
int x = -1;
for(int j = 1; j <= n; j++)
{
if(!st[j] && (x == -1 || dist[j] < dist[x]))
x = j;
}
if(dist[x] == 0x3f3f3f3f)
{
cout << "impossible";
return;
}
st[x] = 1;
res += dist[x];
for(int j = 1; j <= n; j++)
{
if(dist[j] > g[x][j] && !st[j])
{
dist[j] = g[x][j];
pre[j] = x;
}
}
}
cout << res;
}
void getPath()
{
for(int i = n; i > 1; i--)
{
cout << i << " " << pre[i] << " " << endl;
}
}
int main()
{
memset(g, 0x3f, sizeof g);
cin >> n >> m;
while(m --)
{
int a, b, c;
cin >> a >> b >> c;
g[a][b] = g[b][a] = min(g[a][b], c);
}
prim();
//getPath();
return 0;
}
/*
每次将离连通部分最近的点和点对应的边加入到连通部分.
*/
0 条评论
目前还没有评论...