最大生成树夹最小生成树,老题目了,依稀记得当年在成都靠这题捡了个铜。。。。。
2 4 4 1 2 1 2 3 1 3 4 1 1 4 0 5 6 1 2 1 1 3 1 1 4 1 1 5 1 3 5 1 4 2 1
Case #1: Yes Case #2: No
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn=100100; int nf,fib[100]; int getFib() { fib[0]=1;fib[1]=2; nf=2; for(int i=2;fib[nf-1]<=100100;i++) { fib[nf]=fib[nf-1]+fib[nf-2]; nf++; } } int n,m; int fa[maxn]; int find(int x) { if(x==fa[x]) return x; return fa[x]=find(fa[x]); } struct Edge { int u,v,c; }edge[maxn]; bool cmp1(Edge x,Edge y) { return x.c<y.c; } bool cmp2(Edge x,Edge y) { return x.c>y.c; } int Kruscal() { int cnt=n,ans=0; for(int i=0;i<=n+1;i++) fa[i]=i; for(int i=0;i<m;i++) { int f1=find(edge[i].u); int f2=find(edge[i].v); if(f1!=f2) { fa[f1]=f2; ans+=edge[i].c; cnt--; if(cnt==1) break; } } return (cnt==1)?ans:0x3f3f3f3f; } int main() { getFib(); int T_T,cas=1; scanf("%d",&T_T); while(T_T--) { scanf("%d%d",&n,&m); for(int i=0;i<m;i++) { int a,b,w; scanf("%d%d%d",&a,&b,&w); edge[i].u=a; edge[i].v=b; edge[i].c=w; } sort(edge,edge+m,cmp1); int MiMST=Kruscal(); sort(edge,edge+m,cmp2); int MxMST=Kruscal(); bool flag=false; for(int i=0;i<nf;i++) { if(fib[i]>=MiMST&&fib[i]<=MxMST) { flag=true; break; } } printf("Case #%d: ",cas++); if(flag) puts("Yes"); else puts("No"); } return 0; }