当前位置: 代码迷 >> 综合 >> POJ 1698 网络流最大流水题
  详细解决方案

POJ 1698 网络流最大流水题

热度:12   发布时间:2024-01-20 20:30:25.0

赤裸裸的网络最大流...建图还是没有什么技巧的... 继续水...

#include<iostream>
#include<string>
#include<cstdio>
#define MN 444
using namespace std;int s,t,ans,w[8],Sum;
int map[MN][MN],vis[MN],a[MN],pre[MN],que[MN];void setG()
{Sum=0;s=0;ans=0;int n,d,l,i,j,a,b,m=0;memset( map,0,sizeof(map) );scanf( "%d",&n );for( i=1;i<=n;i++ ){for( j=1;j<=7;j++ )scanf( "%d",&w[j] );scanf( "%d%d",&map[0][i],&l );m=max(l,m);Sum+=map[0][i];for( a=0;a<l;a++ )for( b=1;b<=7;b++ )if( w[b] ) map[i][n+a*7+b]=1;}t=m*7+n+1;for( i=n+1;i<t;i++ )map[i][t]=1;
}bool bfs()
{int head=0,foot=0;memset( vis,0,sizeof(vis) );memset( a,0,sizeof(a) );que[foot++]=s;vis[s]=true;a[s]=INT_MAX;while( head<foot ){int u=que[head++];for( int i=0;i<=t;i++ ){if( !vis[i]&&map[u][i] ){a[i]=min( a[u],map[u][i] );vis[i]=true;pre[i]=u;que[foot++]=i;if( i==t )return true;}}}return false;}void EK()
{while( bfs() ){int m=t;ans+=a[t];while( m!=s ){	map[pre[m]][m]-=a[t];map[m][pre[m]]+=a[t];m=pre[m];}}printf( ans==Sum?"Yes\n":"No\n" );
}int main()
{int T;scanf( "%d",&T );while( T-- ){setG();EK();}return 0;
}