zoukankan      html  css  js  c++  java
  • 【Poj 3436】 ACM Computer Factory

    .....这题还有什么要说的吗
    我真是弱!!!

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #define INF 100000000
    using namespace std;
    
    struct GG
    {
    	int v;
    	int fo[11];
    	int to[11];
    }a[110];
    int m,n;
    int s,t;
    int g[110][110];
    int ou[110][110];
    
    int d[110];
    int team[110],head,tail;
    bool can(int x,int y)
    {
    	for(int i=1;i<=m;i++)
    		if(a[x].to[i]!=a[y].fo[i]&&a[y].fo[i]!=2)
    			return false;
    	return true;
    }
    bool bfs()
    {
    	head=tail=0;
    	memset(d,0,sizeof(d));
    	d[s]=1;
    	team[++tail]=s;
    	while(head<tail)
    	{
    		int x=team[++head];
    		for(int i=1;i<=n;i++)
    			if(d[i]==0&&g[x][i]!=0)
    				d[i]=d[x]+1,team[++tail]=i;	
    	}
    	if(d[t]==0) return false;
    	else        return true;
    }
    int dfs(int x,int mmin)
    {
    	int tmp;
    	if(x==t) return mmin;
    	for(int i=1;i<=n;i++)
    		if(d[i]==d[x]+1&&g[x][i]!=0&&(tmp=dfs(i,min(mmin,g[x][i]))))
    		{
    			g[x][i]-=tmp;
    			g[i][x]+=tmp;
    			return tmp;
    		}
    	return 0;
    }
    int main()
    {
    	scanf("%d %d",&m,&n);
    	s=n*2+1;
    	t=n*2+2;
    	for(int i=1;i<=n;i++)
    	{
    		bool bb=true;
    		scanf("%d",&g[i][i+n]);
    		for(int j=1;j<=m;j++) 
    			scanf("%d",&a[i].fo[j]);
    		for(int j=1;j<=m;j++) 
    			scanf("%d",&a[i].to[j]);
    	}
    	for(int i=1;i<=m;i++) a[s].to[i]=0,a[t].fo[i]=1;
    	for(int i=1;i<=n;i++) if(can(s,i)) g[s][i]=INF;
    	for(int i=1;i<=n;i++) if(can(i,t)) g[i+n][t]=INF;
    	for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(i!=j&&can(i,j)) g[i+n][j]=INF;	
    	n*=2;
    	n+=2;
    
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=n;j++)
    			ou[i][j]=g[i][j];
    	int ans=0;
    	while(bfs()) ans+=dfs(s,INF);
    	
    	n-=2;
    	printf("%d ",ans);
    	int tmp=0;
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=n;j++)
    			if(ou[i][j]==INF&&g[i][j]!=ou[i][j]) 
    				tmp++;
    	printf("%d\n",tmp);
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=n;j++)
    			if(ou[i][j]==INF&&g[i][j]!=ou[i][j])		
    				printf("%d %d %d\n",i-n/2,j,ou[i][j]-g[i][j]);
    	return 0;
    }
  • 相关阅读:
    CSS 选择器
    CSS 用法和特性
    Objective-C 事件响应链
    苹果签名机制
    欧几里得算法
    扩展欧几里得算法
    RSA算法
    动态库加载和代码签名
    __attribute__
    信息熵
  • 原文地址:https://www.cnblogs.com/ofsxb/p/5100167.html
Copyright © 2011-2022 走看看