您的位置:首页 > 其它

POJ 2455 Secret Milking Machine

2015-04-23 21:45 357 查看
二分答案再网络流

原来我一直写的Dinic其实是EK。。。好吧,哎。。

import java.util.*;
import java.io.*;

class edge implements Comparable<edge>{
int f,t,l;
public edge(int a,int b,int c){
f=a;t=b;l=c;
}
@Override
public int compareTo(edge x) {
return this.l - x.l;
}
public void print(){
System.out.print(f+"--->"+t+": "+l);
}
}

class problem{
int n,p,t;
edge arr[];
int g[][];
int max_len;
int level[];
void solver() throws IOException{
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(reader.readLine());
n = Integer.valueOf(st.nextToken());
p = Integer.valueOf(st.nextToken());
t = Integer.valueOf(st.nextToken());
arr = new edge[p];
g = new int[n+1][n+1];
for(int i=0;i<p;i++){
st = new StringTokenizer(reader.readLine());
int from = Integer.valueOf(st.nextToken());
int to = Integer.valueOf(st.nextToken());
int len = Integer.valueOf(st.nextToken());
arr[i]=new edge(from,to,len);
if(len>max_len) max_len=len;
}
Arrays.sort(arr);
int left =arr[t-1].l;
int right = max_len;
while(left<=right){
int mid = (left+right)/2;
for(int i=0;i<=n;i++){
Arrays.fill(g[i], 0);
}
for(int i=0;i<p;i++){
if(arr[i].l<=mid){
g[arr[i].f][arr[i].t] +=1;
g[arr[i].t][arr[i].f] +=1;
}else break;
}
int flow = max_flow(1,n);
if(flow>=t){
right=mid-1;
}else{
left=mid+1;
}
}
System.out.println(left);
}
int max_flow(int s, int t){
int flow = 0;
while(bfs(s,t)){
flow+=dfs(s,t,Integer.MAX_VALUE);
}
return flow;
}
boolean bfs(int s, int t){
level = new int[n+1];
Arrays.fill(level, -1);
Queue<Integer> q = new LinkedList<Integer>();
q.add(s);
level[s]=0;
while(!q.isEmpty()){
int tmp = q.poll();
for(int i=1;i<=n;i++){
if(g[tmp][i]>0&&level[i]==-1){
level[i]=level[tmp]+1;
q.add(i);
}
}
}
return level[t]!=-1;
}
int dfs(int s, int t, int min){
if(s==t) return min;
int tmp = min;
for(int i=1;i<=n;i++){
if(g[s][i]==0||level[i]!=level[s]+1) continue;
int d = dfs(i,t,Math.min(min, g[s][i]));
g[s][i]-=d;
g[i][s]+=d;
min-=d;
}
return tmp - min;
}
}
public class fence8{
public static void main (String [] args) throws Exception {
problem p = new problem();
p.solver();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: