FAFU-1198 小三大作战 小三大作战

来源:互联网 发布:中国创新能力知乎 编辑:程序博客网 时间:2024/05/01 21:23

http://acm.fafu.edu.cn/problem.php?id=1198



#include<stdio.h>#include<iostream>#include<string.h>#include<vector>#include<queue>#include<algorithm>using namespace std;const int maxn = 205;const int inf = 1<<30;int n,b,g;int map[maxn][maxn],dis[maxn];bool vis[maxn];bool dinic_Bfs( int st,int end ){memset( vis,0,sizeof(vis) );memset( dis,0,sizeof(dis) );queue<int>que;vis[st] = true;dis[st] = 0;que.push( st );while( !que.empty() ){int u = que.front(); que.pop();if( u == end )return true;for( int v = 1; v <= n; v ++ ){if( !vis[v] && map[u][v] ){vis[v] = true;que.push(v);dis[v] = dis[u] + 1;}}}return false;}int dinic_Dfs( int st,int maxf,int end )  {      int ans = 0,flow;      if( st == end )          return maxf;       for( int i = 1; i <= n; i ++ )      {          if( map[st][i] && dis[i] == dis[st]+1 )          {              flow = dinic_Dfs( i,map[st][i]<maxf?map[st][i]:maxf,end);              map[st][i] -= flow;              map[i][st] += flow;              ans += flow;              maxf -= flow;              if( maxf == 0 )                  return ans;          }      }      if( ans == 0 )   /***注意***/          dis[st]=-1;      return ans;  }  int Dinic( int st,int end )  {      int ans = 0;      while( dinic_Bfs( st,end) )          ans += dinic_Dfs( st,inf,end );      return ans;  }  int main(){    //freopen("data.txt","r",stdin);    while( scanf("%d%d",&g,&b) != EOF ){n = b+g+2;memset(map,0,sizeof(map));for( int i = 2; i <= b+1; i ++ ){scanf("%d",&map[1][i]);}for( int i = 2; i <= b+1; i ++ ){for( int j = b+2; j < n; j ++ ){scanf("%d",&map[i][j]);}}for( int i = b+2; i < n; i ++ ){map[i][n] = 1;}printf("%d\n",Dinic( 1,n ) );}    return 0;}

原创粉丝点击