93分代码
#include<bits/stdc++.h>
using namespace std;
int cnt;
int a[1000000],b[1000000];
int head[1000000];
bool visit[1000000];
struct node
{
int from,to,next;
}edge[1000000];
void add(int a,int b)
{
edge[++cnt].from=a;
edge[cnt].to=b;
edge[cnt].next=head[a];
head[a]=cnt;
}
inline int dfs(int x)
{
for(int i=head[x];i;i=edge[i].next)
{
int v=edge[i].to;
if(visit[v]==0)
{
visit[v]=1;
if(b[v]==0||dfs(b[v]))
{
a[x]=v;
b[v]=x;
return 1;
}
}
}
return 0;
}
int main()
{
int m,n,x,y,e;
int ans=0;
scanf("%d%d%d",&m,&n,&e);
for(int i=1;i<=e;i++)
{
cin>>x>>y;
if(x>=1&&y>=1&&x<=n&&y<=m)
{
add(x,y);
}
}
for(int i=1;i<=m;i++)
if(dfs(i))
{
memset(visit,false,sizeof(visit));
ans++;
}
printf("%d\n",ans);
}
AC代码
#include<bits/stdc++.h>
using namespace std;
int cnt;
int a[1000000],b[1000000];
int head[1000000];
bool visit[1000000];
struct node
{
int from,to,next;
}edge[1000000];
void add(int a,int b)
{
edge[++cnt].from=a;
edge[cnt].to=b;
edge[cnt].next=head[a];
head[a]=cnt;
}
inline int dfs(int x)
{
for(int i=head[x];i;i=edge[i].next)
{
int v=edge[i].to;
if(visit[v]==0)
{
visit[v]=1;
if(b[v]==0||dfs(b[v]))
{
a[x]=v;
b[v]=x;
return 1;
}
}
}
return 0;
}
int main()
{
int m,n,x,y,e;
int ans=0;
scanf("%d%d%d",&n,&m,&e);
for(int i=1;i<=e;i++)
{
cin>>x>>y;
if(x>=1&&y>=1&&x<=n&&y<=m)
{
add(x,y);
}
}
for(int i=1;i<=m;i++)
if(dfs(i))
{
memset(visit,false,sizeof(visit));
ans++;
}
printf("%d\n",ans);
}
只有输入时n,m先后有问题。。这数据emmm