题意有点难读懂
//网络流-EK算法-ACM计算机工厂-构图重点
//Time:0Ms Memory:208K
#include <iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std; #define MAXN 55
#define INF 0x3f3f3f3f int p,n;
int s,t;
int comp[MAXN][22];
int bd[MAXN][MAXN];
int res[MAXN][MAXN];
int pre[MAXN]; bool bfs()
{
memset(pre,-1,sizeof(pre));
queue<int> q;
q.push(s); pre[s] = 0;
while(!q.empty()){
int cur = q.front();
q.pop();
for(int i = 1; i <= t; i++)
{
if(pre[i] == -1 && res[cur][i])
{
pre[i] = cur;
if(i == t) return true;
q.push(i);
}
}
}
return false;
} int EK(int &total)
{
int maxFlow = 0;
while(bfs()){
int mind = INF;
for(int i = t; i != s; i = pre[i])
mind = min(mind, res[pre[i]][i]);
for(int i = t; i != s; i = pre[i])
{
if(i != t && pre[i] != s && res[pre[i]][i] == bd[pre[i]][i]) total++;
res[pre[i]][i] -= mind;
res[i][pre[i]] += mind;
if(i != t && pre[i] != s && res[i][pre[i]] == bd[i][pre[i]]) total--;
}
maxFlow += mind;
}
return maxFlow;
} int main()
{
//freopen("in.txt", "r", stdin);
scanf("%d%d",&p,&n);
s = 0; t = n + 1;
//输入+构图
for(int i = 1; i <= n; i++)
{
bool in = true, out = true;
for(int j = 0; j <= p*2; j++)
{
scanf("%d", &comp[i][j]);
if(j >= 1 && j <= p && comp[i][j] == 1) in = false;
if(j > p && !comp[i][j]) out = false; //未生产完
}
if(in) bd[s][i] = comp[i][0];
if(out) bd[i][t] = comp[i][0];
}
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
{
bool con = true;
if(i == j) continue;
for(int k = 1; k <= p; k++)
{
if(comp[j][k] != 2 && comp[i][k + p] != comp[j][k]) //判断是否可传输此线
{
con = false;
break;
}
}
if(con) bd[i][j] = comp[i][0]; //connection
} memcpy(res, bd, sizeof(bd));
int total = 0;
int maxFlow = EK(total);
printf("%d %d\n", maxFlow, total);
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
{
if(bd[i][j] && bd[i][j] > res[i][j])
printf("%d %d %d\n", i, j, bd[i][j] - res[i][j]);
}
return 0;
}