BZOJ2561: 最小生成树
来源:互联网 发布:欧洲女装品牌 知乎 编辑:程序博客网 时间:2024/06/13 23:14
Description
给定一个边带正权的连通无向图G=(V,E),其中N=|V|,M=|E|,N个点从1到N依次编号,给定三个正整数u,v,和L (u≠v),假设现在加入一条边权为L的边(u,v),那么需要删掉最少多少条边,才能够使得这条边既可能出现在最小生成树上,也可能出现在最大生成树上?
Input
第一行包含用空格隔开的两个整数,分别为N和M;
接下来M行,每行包含三个正整数u,v和w表示图G存在一条边权为w的边(u,v)。
最后一行包含用空格隔开的三个整数,分别为u,v,和 L;
数据保证图中没有自环。
接下来M行,每行包含三个正整数u,v和w表示图G存在一条边权为w的边(u,v)。
最后一行包含用空格隔开的三个整数,分别为u,v,和 L;
数据保证图中没有自环。
Output
输出一行一个整数表示最少需要删掉的边的数量。
Sample Input
3 2
3 2 1
1 2 3
1 2 2
3 2 1
1 2 3
1 2 2
Sample Output
1
HINT
对于20%的数据满足N ≤ 10,M ≤ 20,L ≤ 20;
对于50%的数据满足N ≤ 300,M ≤ 3000,L ≤ 200;
对于100%的数据满足N ≤ 20000,M ≤ 200000,L ≤ 20000。
Source
网络流
考虑一条边(u,v)在图的最小生成树上,则比它小的边一定不能连接u,v
就变成了一个最小割
u,v即为源汇
#include<bits/stdc++.h> using namespace std; const int maxn=20020; const int inf=1e9+7; int cnt=1,ans,n,m,head[maxn]; struct edge{ int to,nxt; int flow;}e[maxn*20]; inline void addedge(int x,int y,int flow){ e[++cnt].to=y; e[cnt].nxt=head[x]; head[x]=cnt; e[cnt].flow=flow; /*e[++cnt].to=x; e[cnt].nxt=head[y]; head[y]=cnt; e[cnt].flow=0;*/} int q[maxn],dis[maxn],S,T; bool bfs(){ int ql=0,qr=1; q[1]=S; memset(dis,0,sizeof(dis)); dis[S]=1; while(ql<qr) { int x=q[++ql]; for(int i=head[x];i;i=e[i].nxt) { int y=e[i].to; if(e[i].flow&&!dis[y]) { dis[y]=dis[x]+1; q[++qr]=y; } } } //printf("%d\n",dis[T]); if(dis[T]) return true; return false;}int dfs(int x,int flow){//if(!flow) return 0; if(x==T) return flow; int d,used=0; for(int i=head[x];i;i=e[i].nxt) { int y=e[i].to; if(e[i].flow&&dis[y]==dis[x]+1) { d=dfs(y,min(flow,e[i].flow)); e[i].flow-=d; e[i^1].flow+=d; used+=d; if(used==flow) return flow; } } //if(used!=-1&&used) //printf("%d %d\n",used,x); if(!used) dis[x]=-1; return used;} inline void dinic(){ while(bfs()) {// printf("true");//for(int i=1;i<=n;i++) cur[i]=head[i]; ans+=dfs(S,inf); }} struct node{int x,y,w;bool operator < (const node &a) const{return w<a.w;}}g[maxn*10]; int main(){//freopen("naive.in","r",stdin);//freopen("orzyfz.out","w",stdout);scanf("%d%d",&n,&m);for(int i=1;i<=m;i++)scanf("%d%d%d",&g[i].x,&g[i].y,&g[i].w);sort(g+1,g+m+1);int L; scanf("%d%d%d",&S,&T,&L);for(int i=1;i<=m;i++){if(g[i].w>=L)break;addedge(g[i].x,g[i].y,1);addedge(g[i].y,g[i].x,1);}dinic();cnt=1;memset(head,0,sizeof(head ));for(int i=m;i;i--){if(g[i].w<=L)break;addedge(g[i].x,g[i].y,1);addedge(g[i].y,g[i].x,1);}dinic();printf("%d",ans); }
0 0
- BZOJ2561 最小生成树
- BZOJ2561 最小生成树
- bzoj2561 最小生成树
- BZOJ2561: 最小生成树
- BZOJ2561: 最小生成树
- 【bzoj2561】最小生成树
- bzoj2561: 最小生成树
- 【最小割】bzoj2561 最小生成树
- bzoj2561 最小生成树 最小割
- 【bzoj2561】最小生成树 最小割
- 【bzoj2561】【最小生成树】【最小割】
- [bzoj2561]最小生成树 最小割
- bzoj2561: 最小生成树 最大流
- Bzoj2561:最小生成树:网络流,最小割
- 2011清华集训.BZOJ2561 && THU A1277.最小生成树(最小割)
- BZOJ2561【最小割】
- bzoj2561 最小割
- 最小比例 最小生成树
- 【RxJava】的学习(一)
- MediaScannerService研究
- 输出大写字母字符串中每个大写字母之后的第5个字母所对应的小写字母
- SPDY协议123
- 不幸运的序列
- BZOJ2561: 最小生成树
- [C++]关于时间的转换和获取
- 20161115
- Reiativelayout
- 线段相交模板
- oracle增加控制文件
- 11/15 日志
- cordova入门——cordova环境配置(一)
- JZOJ 4895 三部曲(线段树)