📄 2831793_wa.cpp
字号:
#include <stdio.h>
#include <math.h>
#include <string.h>
#define INF 2100000000
#define MaxV 201
int n, p, m;
int q[201];
int ans;
int map[200][200];
struct node
{
int a[11];
};
node in[51], out[51];
struct edge
{
int c;
int i, j;
};
int num;
edge e[1000];
int bfs()
{
int i, mark = 0;
int f, r, p;
int pre[MaxV], visited[MaxV];
int queue[MaxV];
int C, F[MaxV];
f = r = -1;
memset(pre,0,sizeof(pre));
memset(visited,0,sizeof(visited));
visited[0] = 1;queue[++f] = 0;pre[0] = -1;
C = INF+1;
while(f!=r)
{
++r;
p = queue[r];
for(i = 0; i < m; i++)
if(map[p][i]&&!visited[i])
{
visited[i] = 1;
queue[++f] = i;
pre[i] = p;
F[i] = map[p][i];
if(i==m-1)
{
mark = 1;
goto m1;
}
}
}
m1:;
if(mark)
{
p = m-1;
while(pre[p]!=-1)
{
if(F[p]<C)
C = F[p];
p = pre[p];
}
p = m-1;
while(pre[p]!=-1)
{
map[pre[p]][p] -= C;
if(map[pre[p]][p]==0&&abs(p-pre[p])!=n)
{
e[num].i = pre[p];
e[num].j = p;
e[num].c = C;
}
map[p][pre[p]] += C;
p = pre[p];
}
ans += C;
num++;
}
return mark;
}
int main()
{
int i, j, k;
int a, b;
int flag;
scanf("%d%d",&p,&n);
ans = num = 0;
memset(map,0,sizeof(map));
for(i = 0; i < n; i++)
{
scanf("%d",&q[i]);
for(j = 0; j < p; j++)
scanf("%d",&in[i].a[j]);
for(j = 0; j < p; j++)
scanf("%d",&out[i].a[j]);
}
for(i = 0; i < n; i++)
{
flag = 1;
for(j = 0; j < p; j++)
if(in[i].a[j]==1)
{
flag = 0;
break;
}
map[0][i+1] = flag*INF;
flag = 1;
for(j = 0; j < p; j++)
if(out[i].a[j]==0)
{
flag = 0;
break;
}
map[i+n+1][2*n+1] = flag*INF;
}
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
{
if(i==j)
continue;
flag = 1;
for(k = 0; k < p; k++)
{
a = out[i].a[k];
b = in[j].a[k];
if(b==2)
continue;
if(b!=a)
{
flag = 0;
break;
}
}
map[i+n+1][j+1] = flag*q[i];
}
for(i = 1; i <= n; i++)
map[i][i+n] = q[i-1];
m = 2*n+2;
while(bfs());
printf("%d %d\n",ans,num);
for(i = 0; i < num; i++)
{
a = e[i].i;
b = e[i].j;
if(a>n)
a -= n;
if(b>n)
b -= n;
printf("%d %d %d\n",a,b,e[i].c);
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -