POJ 3436 ACM Computer Factory(最大流拆点+输出路径)

题目链接

最大流还是理解的不好,稍微变化了一点,就不会了,看了别人拆点的思路后,错了几次,过了,输出路径写了个dfs+标记乱搞了一下。注意建图的时候源点到某一个点,不一定全是0,有2也可以。

  1 #include <iostream>

  2 #include <cstdio>

  3 #include <cstring>

  4 #include <queue>

  5 using namespace std;

  6 const int INF = 0xffffff;

  7 int s[51][51];

  8 int flow[201][201],low[201],path[201],flow1[201][201],o[201][201];

  9 int str,end,n,num;

 10 int sx[501],sy[501],sw[501];

 11 void dfs(int t)

 12 {

 13     int i;

 14     if(n == 2*n+2)

 15     return ;

 16     for(i = 1;i <= 2*n+2;i ++)

 17     {

 18         if(flow1[t][i] - flow[t][i] > 0&&!o[t][i])

 19         {

 20             o[t][i] = 1;

 21             if(t > n&&i <= n&&t != 2*n+1)

 22             {

 23                 sx[num] = t-n;

 24                 sy[num] = i;

 25                 sw[num] = flow1[t][i] - flow[t][i];

 26                 num ++;

 27             }

 28             dfs(i);

 29         }

 30     }

 31 }

 32 int bfs()

 33 {

 34     queue<int>que;

 35     memset(path,-1,sizeof(path));

 36     int i,t;

 37     que.push(str);

 38     low[str] = INF;

 39     while(!que.empty())

 40     {

 41         t = que.front();

 42         que.pop();

 43         if(t == end) break;

 44         for(i = 1;i <= 2*n+2;i ++)

 45         {

 46             if(i != str&&path[i]==-1&&flow[t][i])

 47             {

 48                 path[i] = t;

 49                 low[i] = low[t] < flow[t][i] ? low[t]:flow[t][i];

 50                 que.push(i);

 51             }

 52         }

 53     }

 54     if(path[end] == -1)

 55     return -1;

 56     else

 57     return low[end];

 58 }

 59 int EK()

 60 {

 61     int ans = 0,res,now;

 62     while((res = bfs()) != -1)

 63     {

 64         ans += res;

 65         now = end;

 66         while(now != str)

 67         {

 68             flow[path[now]][now] -= res;

 69             flow[now][path[now]] += res;

 70             now = path[now];

 71         }

 72     }

 73     return ans;

 74 }

 75 int main()

 76 {

 77     int p,i,j,k,w;

 78     scanf("%d%d",&p,&n);

 79     for(i = 1;i <= n;i ++)

 80     {

 81         scanf("%d",&w);

 82         for(j = 1;j <= p;j ++)

 83         scanf("%d",&s[i][j]);

 84         for(j = 1;j <= p;j ++)

 85         scanf("%d",&s[n+i][j]);

 86         flow[i][n+i] = w;

 87     }

 88     for(i = n+1;i <= 2*n;i ++)

 89     {

 90         for(j = 1;j <= n;j ++)

 91         {

 92             for(k = 1;k <= p;k ++)

 93             {

 94                 if(s[j][k] == 1)

 95                 break;

 96             }

 97             if(k == p+1) flow[2*n+1][j] = INF;

 98             for(k = 1;k <= p;k ++)

 99             {

100                 if(s[i][k] != 1)

101                 break;

102             }

103             if(k == p+1) flow[i][2*n+2] = INF;

104             if(i != n+j)

105             {

106                 for(k = 1;k <= p;k ++)

107                 {

108                     if(s[j][k] == 2)

109                     continue;

110                     if(s[i][k] != s[j][k])

111                     break;

112                 }

113                 if(k == p+1)

114                 flow[i][j] = INF;

115             }

116         }

117     }

118     for(i = 1;i <= 200;i ++)

119     {

120         for(j = 1;j <= 200;j ++)

121         flow1[i][j] = flow[i][j];

122     }

123     num = 1;

124     str = 2*n + 1;

125     end = 2*n + 2;

126     printf("%d ",EK());

127     dfs(2*n+1);

128     printf("%d\n",num-1);

129     for(i = 1;i <= num-1;i ++)

130     printf("%d %d %d\n",sx[i],sy[i],sw[i]);

131     return 0;

132 }

 

你可能感兴趣的:(factory)