poj Secret Milking Machine
2012-08-02 21:17
134 查看
题意:有n个点,之间有p条路径(无向,可重复),要求求出要同时存在T条路径(每条边都不重复的条件下),路径中边的最短距离。
方法:二分搜索+最大流,二分枚举所有的距离,求出最短的,再构造网络(存在一条边两点之间的通路小于枚举值,两点间的流量自加1),最后的最大流如果是大于
或等于T的话就成立。
方法:二分搜索+最大流,二分枚举所有的距离,求出最短的,再构造网络(存在一条边两点之间的通路小于枚举值,两点间的流量自加1),最后的最大流如果是大于
#include<iostream> #include<vector> using namespace std; const int inf = 0x7fffffff; const int MAXN = 210; struct edge { int v,u,w; }E[40001]; const int MAXM = MAXN*MAXN; int map[MAXN][MAXN]; int dis[MAXN]; int queue[MAXM]; int bef[MAXN]; int num[MAXN]; void set_dis(int end) { int top(0),base(0); memset(dis,-1,sizeof(dis)); memset(num,0,sizeof(num)); queue[top++] = end; dis[end]=0;num[0] = 1; while(top!=base) { int pre = queue[base++]; for(int i=end-1;i!=0;i--) { if(dis[i] != -1 || map[i][pre] == 0) continue; dis[i] = dis[pre]+1; queue[top++] = i; num[dis[i]]++; } } } int cmp(int x,int y) { if(x<y) return x; return y; } int remark(int n,int a) { int tmp=inf; for(int i=1;i!=n+1;i++) if(map[a][i]!=0&&dis[i]>=0) tmp=cmp(tmp,dis[i]+1); if(tmp==inf) tmp=n; return tmp; } int SAP(int n,int s) { int j,a = s;int flow(0); memset(bef,-1,sizeof(bef)); while(dis[s]<n) { for(j=1;j!=n+1;j++) { if(map[a][j]>0&&dis[a]-1==dis[j]) { break; } } if(j<=n) { bef[j] = a;a = j; if(a==n) { int i = n,max(inf); while(bef[i]!=-1) { max = cmp(max,map[bef[i]][i]); i = bef[i]; } i = n; while(bef[i]!=-1) { map[bef[i]][i]-=max; map[i][bef[i]]+=max; i = bef[i]; } flow+=max;a=s; } } else { int x = remark(n,a); num[x]++;num[dis[a]]--; if(num[dis[a]]==0) return flow;//间隙优化 gap dis[a]=x; if(a!=s) a=bef[a]; } } return flow; } void build(int n,int max,int p) { for(int i=1;i!=p+1;i++) { if(E[i].w<=max) { map[E[i].u][E[i].v]++; map[E[i].v][E[i].u]++; } } } bool judge(int p,int n,int T,int max) { memset(map,0,sizeof(map)); build(n,max,p); set_dis(n); int f = SAP(n,1); //cout<<f<<endl; if(f >= T) return true; return false; } int main() { int N,P,T; while(cin>>N>>P>>T) { memset(E,0,sizeof(E)); int max(-1); for(int i=1;i!=P+1;i++) { cin>>E[i].u>>E[i].v>>E[i].w; if(E[i].w>max) max = E[i].w+1; } int min = 0;int mid; while(min!=max) { mid = (max+min)>>1; if(judge(P,N,T,mid)) { max = mid; } else { min = mid+1; } } cout<<max<<endl; } return 0; }
或等于T的话就成立。
相关文章推荐
- poj 2455 Secret Milking Machine 从1到n有多少条不同的路径(每条边走一次) 网络流 cap赋值为1
- POJ 2455 Secret Milking Machine(最大流+二分)
- POJ 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 2455 Secret Milking Machine (最大流)
- POJ 2455 Secret Milking Machine && 二分枚举 + 最大流
- poj 2455 Secret Milking Machine 二分+最大流 sap
- 【最大流+dinic+二分】北大 poj 2455 Secret Milking Machine
- POJ 2455 - Secret Milking Machine
- POJ 2455 Secret Milking Machine 最大流 二分答案
- POJ 2455 Secret Milking Machine
- POJ2455 Secret Milking Machine 典型二分答案+最大流判定
- Secret Milking Machine POJ - 2455
- POJ 2455 Secret Milking Machine (二分 + 最大流)
- POJ 2455 Secret Milking Machine (二分答案+最大流)