prim算法-2025/11/20

prim算法

#include<bits/stdc++.h>
using namespace std;

const int N = 510, INF = 0x3f3f3f3f;

int g[N][N];
int n, m;
int dist[N] , st[N];


int prim(){
	memset(dist, 0x3f, sizeof dist);
	int res = 0;
	for(int i = 0; i < n ; i++){
		int t=  -1;
		for(int j = 1;  j <= n; j++){
			if(!st[j] && (t == -1 || dist[t] > dist[j]))
				t  = j;
		}
		cout << t << " "  << dist[t] << "\n";
		if(i && dist[t] == INF) return INF;
		if(i) res += dist[t];
		st[t] = 1;
		
		for(int j = 1;  j<=n;j++){
//			cout << "g[t][j]::" << g[t][j] << "\n";
			dist[j] = min(dist[j], g[t][j]);
		}
		
	}
	
	return res;
}

int main(){
	
	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] = INF;
	
	for(int i = 1; i <= n; i++)
	{
		for(int j = 1; j <= n; j++)
			cout << g[i][j] << " ";
		
		cout << "\n";
	}
	
	cin >> n >> m;
	for(int i = 1; i <= m; i++){
		int a, b ,c;
		cin >> a >> b >> c;
		g[a][b] = g[b][a] = min(g[a][b] , c);
	}
	
	for(int i = 1; i <= n; i++)
	{
		for(int j = 1; j <= n; j++)
			cout << g[i][j] << " ";
		
		cout << "\n";
	}
		
		
	
	int t = prim();
	
	if(t == INF) puts("impossible");
	else cout << t << "\n";
	
	return 0;
}
posted @ 2025-11-28 23:00  XYu1230  阅读(3)  评论(0)    收藏  举报