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 }
posted @ 2022-02-15 21:42  scannerkk  阅读(35)  评论(0)    收藏  举报