图算法--kruskal

kruskal算法的时间复杂度瓶颈在排序上

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 int n,m;
 5 const int N=1e5+10,M=2e5+10,INF=0x3f3f3f3f;
 6 struct edge{
 7     int a,b,w;
 8     bool operator<(edge t){
 9         return w<t.w;
10     }
11 }edges[M];
12 int p[N];
13 int find(int x){
14     if(p[x]!=x){
15         p[x]=find(p[x]);
16     }
17     return p[x];
18 }
19 int kruskal(){
20     sort(edges,edges+m);
21     for(int i=1;i<=n;i++){
22         p[i]=i;
23     }
24     int res=0,cnt=0;
25     for(int i=0;i<m;i++){
26         int pa=find(edges[i].a);
27         int pb=find(edges[i].b);
28         if(pa!=pb){
29             res+=edges[i].w;
30             p[pa]=pb;//不会有人这里也会写反把
31             cnt++;
32         }
33     }
34     if(cnt<n-1){
35         return INF;
36     }
37     return res;
38 }
39 
40 int main(void){
41     cin>>n>>m;
42     for(int i=0;i<m;i++){
43         int a,b,w;
44         cin>>a>>b>>w;
45         edges[i]={a,b,w};
46     }
47     int res=kruskal();
48     if(res==INF){
49         cout<<"impossible";
50     }else{
51         cout<<res;
52     }
53     return 0;
54 }

 

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