bzoj2654 Tree 二分答案+最小生成树
来源:互联网 发布:js function use 编辑:程序博客网 时间:2024/05/29 15:15
今天讲课时的课件变成了至少k条,然后发现不会做
然后我问了他下正确性证明,然后他就委掉了.
不过正好是k条的方法很简单,显然我们需要控制白边的数量,那么我们控制权值就行
二分边权加上多少,然后最小生成树就好
然而我发现加上一句不等于k的时候去掉答案,就WA掉了= =
说明这道题实际上是大于等于k的,讲题人是没有错的= =
然而并不知道正确性证明.
几分钟后:
哦明白了,因为题目保证有解所以实际上我们不断接近的过程就是保证有解得过程,但是最后一次并不能保证正好是k条,于是数据是错的,加上那句话跑出来的答案加上一个判断是否是答案来更新的语句才可以是对的
/* ***********************************************Author :BPM136Created Time :2016/3/31 17:02:10File Name :bzoj2654.cpp************************************************ */#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>#include<vector>#include<queue>#include<set>#include<map>#include<string>#include<math.h>#include<stdlib.h>#include<time.h>#define LL long long#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)#define efo(i,x) for(int i=last[x];i!=0;i=e[i].next)using namespace std;LL read(){ LL d=0,f=1;char s=getchar(); while(s<48||s>57){if(s==45)f=-1;s=getchar();} while(s>=48&&s<=57){d=d*10+s-48;s=getchar();} return d*f;}#define N 50005#define M 100005struct bian{int s,t,w,color;bian(int x,int y,int ww,int col){s=x,t=y,w=ww,color=col;}bian(){}}ee[M*2];int full,ans,n,m,need;int f[N];int find(int x){if(f[x]==x)return x;else return f[x]=find(f[x]);}bool come(bian a,bian b){int a1=a.w,b1=b.w;if(a.color==0)a1+=full;if(b.color==0)b1+=full;if(a1==b1)return a.color<b.color;return a1<b1;}bool check(int anss){full=anss;ans=0;sort(ee+1,ee+m+1,come);fo(i,1,n)f[i]=i;int k=1;int flag=0;while(k<=m){int a1=find(ee[k].s),b1=find(ee[k].t);//cout<<"edgeinformation:"<<a1<<' '<<ee[k].s<<' '<<f[1]<<' '<<b1<<' '<<ee[k].t<<' '<<f[2]<<endl;if(a1!=b1){f[a1]=b1;ans+=ee[k].w+anss*(ee[k].color^1);flag+=ee[k].color^1;}//cout<<"finunioninformation:"<<ee[k].s<<' '<<ee[k].t<<' '<<ee[k].w<<' '<<ee[k].color<<' '<<f[1]<<' '<<f[2]<<endl;k++;}//cout<<"finishcheckinformation:"<<anss<<" "<<flag<<' '<<need<<' '<<ans<<endl;//if(flag!=need)ans=0;去掉答案后就WA掉了= =return flag>=need;}int EF(int l,int r){int ret=0;while(l<=r){int mid=(l+r)>>1;if(check(mid)){l=mid+1;ret=ans-mid*need;}else r=mid-1;}return ret;}int main(){ //freopen(".in","r",stdin); //freopen(".out","w",stdout);//n=read(),m=read(),need=read();cin>>n>>m>>need;fo(i,1,m){//int x=read(),y=read(),t=read(),tt=read();scanf("%d%d%d%d",&ee[i].s,&ee[i].t,&ee[i].w,&ee[i].color);ee[i].s++,ee[i].t++;}int an=EF(-100,100);cout<<an<<endl; return 0;}
0 0
- bzoj2654 Tree 二分答案+最小生成树
- bzoj2654 二分答案+最小生成树
- 【bzoj2654】【tree】【二分+最小生成树】
- 【二分+最小生成树】bzoj2654 tree
- 【BZOJ2654】tree【二分】【最小生成树】
- bzoj2654 tree 最小生成树+二分验证
- [bzoj2654]tree 二分+最小生成树
- 【bzoj2654】【二分+最小生成树】tree
- [bzoj2654]tree(二分+最小生成树)
- 【二分+最小生成树】BZOJ2654[tree]题解
- 【二分+最小生成树】BZOJ2654 tree
- [bzoj2654][最小生成树][二分]tree
- bzoj2654: tree(二分+最小生成树)
- bzoj2654 二分+最小生成树
- BZOJ 2654 tree(二分答案+最小生成树)
- bzoj2654 tree(二分+kruskal)
- [WQS二分] BZOJ2654:tree
- 修公路 最小生成树 二分答案
- 禁忌搜索算法
- javaScript简易运动框架封装——和派孔明
- JAVA动态规划(一)--最少硬币找零问题
- Java之旅--定时任务(Timer、Quartz、Spring、LinuxCron)
- startActivityForResult , onActivityResult , setResult 的用法
- bzoj2654 Tree 二分答案+最小生成树
- Synchronize实现原理(很难)
- 程序启动与运行
- Linux_ pipe 匿名管道 浅解
- ajax jsonp 跨域
- 如何快速将idea快捷键转化成Eclipse风格
- bzoj 3343: 教主的魔法
- Spring框架中IOC和aop
- 《机器学习实战》——k-近邻算法Python实现问题记录