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 }

浙公网安备 33010602011771号