P3366最小生成树
一、题目描述
二、解题思路
这个题主要注意一下会输入重复的边,你在存图时取个最小边权就行了
三、代码实现
1 #include "bits/stdc++.h" 2 const int inf = 1e9 + 10; 3 using namespace std; 4 int graph[5010][5010]; 5 int vis[5010]; 6 int dis[5010]; 7 int cnt; 8 int n,m; 9 void init() 10 { 11 for(int i = 1;i <= n;i++) 12 for(int j = 1;j <= n;j++) 13 graph[i][j] = inf; 14 for(int i = 2;i <= n;i++) 15 dis[i] = inf; 16 } 17 void prim() 18 { 19 int k,mn; 20 for(int i = 2;i <= n;i++) 21 dis[i] = graph[1][i]; 22 vis[1] = 1; 23 int flag = 0; 24 long long ans = 0; 25 for(int i = 2;i <= n;i++){ 26 mn = inf; 27 k = -1; 28 for(int j = 1;j <= n;j++) 29 if(!vis[j] && dis[j] < mn) 30 k = j,mn = dis[j]; 31 if(k == -1){ 32 flag = 1; 33 break; 34 } 35 // cout << k << endl; 36 vis[k] = 1; 37 ans += mn; 38 for(int j = 1;j <= n;j++) 39 if(!vis[j] && dis[j] > graph[k][j]) 40 dis[j] = graph[k][j]; 41 } 42 if(flag) 43 cout << "orz" << endl; 44 else 45 cout << ans << endl; 46 } 47 int main() 48 { 49 cin >> n >> m; 50 init(); 51 for(int i = 1;i <= m;i++){ 52 int u,v,w; 53 cin >> u >> v >> w; 54 graph[u][v] = min(graph[u][v],w); 55 graph[v][u] = min(graph[v][u],w); 56 } 57 prim(); 58 return 0; 59 }
本文来自博客园,作者:{scanner},转载请注明原文链接:{https://home.cnblogs.com/u/scannerkk/}