图算法--最小生成树prim

思路类似于dijkstra,只不过松弛的时候略微不同,松弛成到已经确定的任一点的最短距离,而dijkstra则是松弛为到起点的最短距离

 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 const int N=510,INF=0x3f3f3f3f;
 5 int n,m;
 6 int g[N][N];
 7 int dis[N];
 8 bool st[N];
 9 int prim(){
10     memset(dis,0x3f,sizeof dis);
11     dis[1]=0;
12     int res=0;
13     for(int i=0;i<n;i++){
14         int t=-1;
15         for(int j=1;j<=n;j++){
16             if(!st[j]&&(t==-1||dis[j]<dis[t])){
17                 t=j;
18             }
19         }
20         if(dis[t]==INF){
21             return INF;
22         }
23         st[t]=true;
24         res+=dis[t];
25         for(int j=1;j<=n;j++){
26             dis[j]=min(dis[j],g[t][j]);
27         }
28     }
29     return res;
30 }
31 int main(void){
32     memset(g,0x3f,sizeof g);
33     cin>>n>>m;
34     for(int i=0;i<m;i++){
35         int a,b,c;
36         cin>>a>>b>>c;
37         g[a][b]=g[b][a]=min(g[a][b],c);
38     }
39     int res=prim();
40     if(res==INF){
41         cout<<"impossible";
42     }else{
43         cout<<res;
44     }
45     return 0;
46 }

 

posted on 2020-11-23 16:45  greenofyu  阅读(101)  评论(0编辑  收藏  举报