Secret Milking Machine POJ
来源:互联网 发布:网络用语吃鸡什么意思 编辑:程序博客网 时间:2024/05/24 07:28
点击打开链接
二分最大边 记为lim 不超过lim的边容量记为1 否则记为0 再抽象一个源点 从源点到1的容量为题目所给的t 然后以此建图 看是否满流
感觉网络流的抽象建图很关键 这道题看了别人的建图才会的...
符合条件就是1 即存在 反之就是0 即不存在 这样就把一个记录路径长度的图转化为记录路径是否可行的图 每增广一次图中就少一条路 长知识了!
#include <stdio.h>#include <queue>#include <cstring>#include <algorithm>using namespace std;#define N 1e9struct node1{ int u; int v; int w;};struct node2{ int v; int w; int next;};node1 pree[80010];node2 edge[160010];int first[210],dis[210],gap[210],cur[210],pre[210];int n,m,t,num,sum,ans,ss,ee;void binsearch(int l,int r);void build(int lim);void addedge(int u,int v,int w);void isap();void bfs();int main(){ int i,u,v,w,minn,maxx; while(scanf("%d%d%d",&n,&m,&t)!=EOF) { num=0,minn=N,maxx=0; for(i=1;i<=m;i++) { scanf("%d%d%d",&u,&v,&w); num++; pree[num].u=u; pree[num].v=v; pree[num].w=w; num++; pree[num].u=v; pree[num].v=u; pree[num].w=w; if(w<minn) minn=w; if(w>maxx) maxx=w; } binsearch(minn,maxx); printf("%d\n",ans); } return 0;}void binsearch(int l,int r){ int lim; ans=r; while(l<=r) { lim=(l+r)/2; build(lim); isap(); if(sum>=t) { r=lim-1; ans=lim; } else { l=lim+1; } } return;}void build(int lim){ int i; memset(first,-1,sizeof(first)); num=0,ss=n+1,ee=n; addedge(ss,1,t); addedge(1,ss,0); for(i=1;i<=m*2;i++) { if(pree[i].w<=lim) { addedge(pree[i].u,pree[i].v,1); addedge(pree[i].v,pree[i].u,0); } else { addedge(pree[i].u,pree[i].v,0); } } return;}void addedge(int u,int v,int w){ edge[num].v=v; edge[num].w=w; edge[num].next=first[u]; first[u]=num++; return;}void isap(){ int j,u,v,flow,minn; memcpy(cur,first,sizeof(first)); memset(pre,-1,sizeof(pre)); bfs(); num=n+1,sum=0,u=ss,flow=N; while(dis[ss]<num) { int &i=cur[u]; for(;i!=-1;i=edge[i].next) { v=edge[i].v; if(edge[i].w>0&&dis[v]+1==dis[u]) { pre[v]=i; u=v,flow=min(flow,edge[i].w); if(u==ee) { while(u!=ss) { j=pre[u]; edge[j].w-=flow; edge[j^1].w+=flow; u=edge[j^1].v; } sum+=flow,flow=N; } break; } } if(i==-1) { if(--gap[dis[u]]==0) break; cur[u]=first[u]; minn=num-1; for(j=first[u];j!=-1;j=edge[j].next) { if(edge[j].w>0) { minn=min(minn,dis[edge[j].v]); } } dis[u]=minn+1; gap[dis[u]]++; if(u!=ss) { u=edge[pre[u]^1].v; } } } return;}void bfs(){ queue <int> que; int i,u,v; memset(dis,-1,sizeof(dis)); memset(gap,0,sizeof(gap)); que.push(ee); dis[ee]=0; while(!que.empty()) { u=que.front(); que.pop(); gap[dis[u]]++; for(i=first[u];i!=-1;i=edge[i].next) { v=edge[i].v; if(dis[v]==-1) { dis[v]=dis[u]+1; que.push(v); } } } return;}
阅读全文
1 0
- poj Secret Milking Machine
- Secret Milking Machine POJ
- POJ 2455 Secret Milking Machine
- poj 2455 Secret Milking Machine
- poj 2455 Secret Milking Machine
- POJ-2455-Secret Milking Machine
- POJ 2455 Secret Milking Machine
- poj 2455 Secret Milking Machine
- POJ 2455 Secret Milking Machine (最大流)
- POJ Secret Milking Machine 【网络流+二分】
- 【网络流】 POJ 2455 Secret Milking Machine
- Secret Milking Machine
- POJ2455 Secret Milking Machine
- POJ2455-Secret Milking Machine
- POJ 2455.Secret Milking Machine【最大流+二分】
- POJ 2455 Secret Milking Machine(二分答案+最大流)
- 【最大流+dinic+二分】北大 poj 2455 Secret Milking Machine
- poj 2455 Secret Milking Machine 最大流+二分查找
- TP5项目在lnmp环境上线出现500错误
- javascript的for in 循环
- CentOS常使用命令
- 定长的顺序表及基本操作
- 如何让表单文本框左边标签文本右对齐---label
- Secret Milking Machine POJ
- JDK学习-CountDownLatch/CyclicBarrier
- C++中有关类继承的知识
- linux下mysql安装
- 【洛谷】P1080国王游戏(高精)
- Vector&List的使用
- PAT 甲级 1061. Dating (20)
- js通过contentWindow控制iframe子页面元素点击事件,并把值传给父页面
- JDK学习-Stack/List