一眼看出二分图。。
#include <cstdio>
#include <cstring>
int n,m,u,v;
struct edge {
int v,next;
}e[2010];
int cnt,head[2010];
int cc,vis[2010],Link[2010];
int read_int () {
char c = getchar();
int re = 0;
for(;c > '9' || c < '0';c = getchar());
for(;c >= '0' && c <= '9';c = getchar())
re = re * 10 + c - '0';
return re;
}
void adde (int u,int v) {
e[++cnt].v = v;
e[cnt].next = head[u];
head[u] = cnt;
}
int find (int u,int flg) {
for(int i = head[u];i != -1;i = e[i].next) {
int v = e[i].v;
if(vis[v] == flg)
continue;
vis[v] = flg;
if(!Link[v] || find(Link[v],flg)) {
Link[v] = u;
Link[u] = v;
return 1;
}
}
return 0;
}
int main () {
memset(head,-1,sizeof head);
n = read_int();
m = read_int();
for(int i = 1;i <= m;++i) {
u = read_int();
v = read_int();
adde(i,m + u);
if(u != v)
adde(i,v + m);
}
int ccnt = 0;
for(int i = 1;i <= m;++i) {
if(!Link[i]) {
if(find(i,++cc))
++ccnt;
else break;
}
}
printf("%d\n",ccnt);
}