煞笔的煞笔又来发水题题解了!
二分答案。先判一级公路然后判二级公路。没了。
1A什么的不必多说。。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; struct E{ int u,v,c1,c2;}e[20005]; inline bool C(E a,E b){ return a.c1<b.c1;} int F[10005],n,k,m; char buf[2000000],*pt=buf; int GF(int x){ return x==F[x]?x:F[x]=GF(F[x]);} inline int getint(){ int r=0;while(*pt<'0'||*pt>'9')pt++;while(*pt>='0'&&*pt<='9')r=r*10+*pt++-48;return r; }inline int ok(int lmt){ int ck=0,ca=0; for(int i=1;i<=n;i++) F[i]=i; for(int i=1;i<=m;i++){ if(e[i].c1<=lmt){ int u=GF(e[i].u),v=GF(e[i].v); if(u!=v) F[u]=v,ck++,ca++; if(ca==n-1) return 1; }else{ if(ck<k) return 0; if(min(e[i].c1,e[i].c2)>lmt) continue; int u=GF(e[i].u),v=GF(e[i].v); if(u!=v) F[u]=v,ca++; if(ca==n-1) return 1; } }return 0; }int main(){ fread(pt,1,2000000,stdin); int i; for(n=getint(),k=getint(),m=getint(),i=1;i<m;i++) e[i].u=getint(),e[i].v=getint(),e[i].c1=getint(),e[i].c2=getint(); sort(e+1,e+m+1,C); int l=0,r=1000000009,mid; while(l<=r){ mid=l+r>>1; if(ok(mid)) r=mid-1; else l=mid+1; }printf("%d\n",l);return 0; }