zoukankan      html  css  js  c++  java
  • poj 1149 PIGS 最大流

    #include "stdio.h"   //poj 1149 最大流
    #include "string.h"
    #include "queue"
    using namespace std;
    
    #define N 2250
    #define INF 0x3fffffff
    
    struct node
    {
    	int u,v,w;
    	int next;
    }edge[8*N];
    
    int n,idx;
    int start,end;
    int route[N],maxf[N],head[N],last[N];
    
    int EK();
    int BFS();
    void init();
    void adde(int u,int v,int w);
    void addedge(int u,int v,int w);
    int MIN(int x,int y){ return x<y?x:y;}
    
    int main()
    {
    	int m,k;
    	int i,j;
    	int u,v,w,Case;
    
    	while(scanf("%d %d",&m,&k)!=-1)
    	{
    		init();
    		start = 0;  //超级源点
    		end = m+k+1;  //超级汇点
    		for(n=1;n<=m;n++)
    		{
    			scanf("%d",&w);
    			adde(start,n,w);
    			last[n] = n;
    		}
    		n=m;
    		for(i=1;i<=k;i++)
    		{
    			n++;
    			scanf("%d",&Case);
    			while(Case--)
    			{
    				scanf("%d",&v);
    				adde(last[v],n,INF);
    				last[v] = n;
    			}
    			scanf("%d",&w);
    			adde(n,end,w);
    		}
    		int ans = EK();
    		printf("%d
    ",ans);
    	}
    	return 0;
    }
    
    void init()
    {
    	idx = 0;
    	memset(head,-1,sizeof(head));
    }
    
    void adde(int u,int v,int w)
    {
    	addedge(u,v,w);
    	addedge(v,u,0);
    }
    
    void addedge(int u,int v,int w)
    {
    	edge[idx].u = u;
    	edge[idx].v = v;
    	edge[idx].w = w;
    	edge[idx].next = head[u];
    	head[u] = idx;
    	idx++;
    }
    
    int EK()
    {
    	int ans=0,kejia;
    	int x,y;
    	while(kejia = BFS())
    	{
    		ans += kejia;
    		y = route[end];
    		while(y!=-1)
    		{
    			x = y^1;
    			edge[y].w -= kejia;
    			edge[x].w += kejia;
    			y = route[edge[y].u];
    		}
    	}
    	return ans;
    }
    
    int BFS()
    {
    	int i;
    	int x,y;
    	memset(route,-1,sizeof(route));
    	for(i=0;i<N;i++)	maxf[i] = INF;
    	route[0] = 0;
    	queue<int> q;
    	q.push(start);
    	while(!q.empty())
    	{
    		x = q.front();
    		q.pop();
    		for(i=head[x];i!=-1;i=edge[i].next)
    		{
    			y = edge[i].v;
    			if(route[y]==-1 && edge[i].w>0)
    			{
    				maxf[y] = MIN(maxf[x],edge[i].w);
    				route[y] = i;
    				q.push(y);
    			}
    		}
    	}
    	route[0] = -1;
    	if(route[end]==-1) return 0;
    	return maxf[end];
    }
    
    
    //http://www.cnblogs.com/rainydays/archive/2011/08/27/2155710.html

  • 相关阅读:
    java反射机制
    Java注解的使用
    C3P0数据库Jar包的使用
    异常处理
    集合的概念
    程序员必备之二分查找
    ArrayList的使用
    HashMap的使用
    Final的使用
    类的基本结构
  • 原文地址:https://www.cnblogs.com/ruo-yu/p/4411997.html
Copyright © 2011-2022 走看看