记录编号 |
587397 |
评测结果 |
AAAAAAAAAA |
题目名称 |
寻找代表元 |
最终得分 |
100 |
用户昵称 |
Untitled |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.007 s |
提交时间 |
2024-03-28 19:57:56 |
内存使用 |
1.91 MiB |
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
int const N=410;
int n,m,res,f[N][N],level[N];
bool d[N];
struct node{
int x,lvl;
};
bool bfs(int const Ed){
memset(d,0,sizeof(d));
memset(level,0,sizeof(level));
queue<node> q;
node t;
int x,lvl;
q.push(node{1,1});
while (q.size()){
t=q.front();q.pop();
x=t.x,lvl=t.lvl;
level[x]=lvl,d[x]=1;
for (int y=1;y<=Ed;y++){
if (x==y || d[y] || !f[x][y]) continue;
q.push(node{y,lvl+1});
}
}
return d[Ed];
}
int dfs(int x,int minn,int const Ed){
if (x==Ed) return minn;
int k,cnt=0;
for (int y=1;y<=Ed;y++){
if (x==y || level[y]<level[x] || !f[x][y]) continue;
k=dfs(y,min(minn,f[x][y]),Ed);
f[x][y]-=k,minn-=k,f[y][x]+=k,cnt+=k;
if (!minn) break;
}
return cnt;
}
int main(){
freopen("unique.in","r",stdin);
freopen("unique.out","w",stdout);
int a;
scanf("%d %d",&n,&m);
int const St=1,Np=1+n,Ed=2+n+m;
for (int i=1;i<=n;i++) f[St][St+i]=1;
for (int i=1;i<=m;i++) f[Np+i][Ed]=1;
for (int i=1;i<=n;i++){
while(scanf("%d",&a)){
if (!a) break;
f[St+i][Np+a]++;
}
}
while (bfs(Ed)){
res+=dfs(1,INT_MAX,Ed);
}
printf("%d",res);
return 0;
}