Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

大牛们帮忙看看我为什么总是WA吧。。。谢谢!

Posted by doommetal at 2007-09-26 16:05:30 on Problem 2455
思路是:二分枚举一个边长度,凡是长度不大于枚举值的边设置容量为1,否则容量为0;求出最大流,判断是否大于t;如此反复。。。

代码如下:

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

public class Main
{
	static final int maxn=205;
	static final int maxm=40005;
	static final int maxint=0x7fffffff;
	static int side[]=new int[maxm];
	static int cap[][]=new int[maxn][maxn];
	static int flow[][]=new int[maxn][maxn];
	static int graph[][]=new int[maxn][maxn];
	static int pre[]=new int[maxn];
	static int ls;
	static int n,p,t;
	static int max_flow;
	static int T,S;
	static void insert(int k)
	{
		int i;
		for(i=0;i<ls;i++)
			if(side[i]==k)
				break;
	    if(i>=ls){
	    	side[ls++]=k;
	    }
	}
	static int min(int a,int b)
	{
		return a<b?a:b;
	}
	static int BFS()
	{
		int que[]=new int[maxn];
		int mark[]=new int[maxn];
		int i,u;
		int closed=0,open=-1;
		for(i=0;i<=n;i++)
			mark[i]=0;
		mark[1]=1;
		que[0]=1;
		while(open<closed)
		{
			open++;
			u=que[open];
			for(i=1;i<=n;i++)
				if(cap[u][i]-flow[u][i]>0 && mark[i]==0){
					closed++;
					que[closed]=i;
					mark[i]=1;
					pre[i]=u;
					if(i==T)
						return 1;
				}
		}
		return 0;
	}
	static void Edmonds_Karp()
	{
		int cp,v;
		while(BFS()==1)
		{
			cp=maxint;
			for(v=T;v!=S;v=pre[v])
				cp=min(cp,cap[pre[v]][v]-flow[pre[v]][v]);
			for(v=T;v!=S;v=pre[v]){
				flow[pre[v]][v]+=cp;
				flow[v][pre[v]]=-flow[pre[v]][v];
			}		
			max_flow+=cp;
		}
	}
	public static void main(String args[]) throws Exception
	{
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		String[] tmp;
		tmp=in.readLine().split(" ");
		n=Integer.parseInt(tmp[0]);
		p=Integer.parseInt(tmp[1]);
		t=Integer.parseInt(tmp[2]);
		int i,j,k,x,y,mid,ans=maxint;
		for(i=0;i<=n;i++)
			for(j=0;j<=n;j++)
				graph[i][j]=0;
		ls=0;
		for(i=0;i<p;i++){
			tmp=in.readLine().split(" ");
			x=Integer.parseInt(tmp[0]);
			y=Integer.parseInt(tmp[1]);
			k=Integer.parseInt(tmp[2]);
			graph[x][y]=k;
			insert(k);
		}
		
    	Arrays.sort(side,0,ls-1);
    	x=0;
		y=ls-1;
		mid=(x+y)/2;
		S=1;
		T=n;
		while(x<=y){
			mid=(x+y)/2;
			for(i=0;i<=n;i++)
				for(j=0;j<=n;j++)
					flow[i][j]=0;
			for(i=0;i<=n;i++)
				for(j=0;j<=n;j++)
					if(graph[i][j]<=side[mid] && graph[i][j]>0)
						cap[i][j]=1;
					else
						cap[i][j]=0;
		   max_flow=0;
		   Edmonds_Karp();
		   if(max_flow>=t){
			    y=mid-1;
			    ans=min(ans,side[mid]);
		   }
		   else
			   x=mid+1;
		}
		System.out.println(ans);
	}
}





Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator