meixiuxiu学图论

 

1.最小生成树的应用。

2.Kruskal算法按照边的权值的顺序从小到大查看一遍,如果不产生环,包括重边,就把当前这条边加入到生成树中。因此,没有加入到生成树中的边就是对应环中权值最大的边!!!

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<queue>
 6 using namespace std;
 7 
 8 const int maxn=2000005;
 9 const int INF=100000000;
10 
11 struct edge{
12     int u,v,cost;
13     bool operator <(const edge& i)const{
14         return cost<i.cost;
15     }
16 }es[maxn];
17 
18 int T,V,E;
19 int fa[500005];
20 
21 int Find(int a){
22     if(a!=fa[a]) return fa[a]=Find(fa[a]);
23     return fa[a];
24 }
25 
26 bool Union(int a,int b){
27     if(Find(a)==Find(b)) return false;
28     fa[Find(b)]=Find(a);
29     return true;
30 }
31 
32 int Kruskal()
33 {   sort(es+1,es+E+1);
34     //for(int i=1;i<=E;i++) printf("%d%c",es[i].cost,i==E?'\n':' ');
35     for(int i=1;i<=V;i++) fa[i]=i;
36     int ans=INF;
37     for(int i=1;i<=E;i++){
38         edge e=es[i];
39         if(!Union(e.u,e.v)) ans=min(ans,e.cost);
40     }
41     return ans;
42 }
43 
44 int main()
45 {   cin>>T;
46     while(T--){
47         scanf("%d%d",&V,&E);
48         for(int i=1;i<=E;i++) scanf("%d%d%d",&es[i].u,&es[i].v,&es[i].cost);
49         int mans=Kruskal();
50         if(mans==INF) printf("No solution!\n");
51         else printf("%d\n",mans);
52     }
53     return 0;
54 }

 

posted @ 2017-06-14 20:16  天之道,利而不害  阅读(204)  评论(0)    收藏  举报