哇塞,n,m输反了都有93分,这数据有毒.
查看原帖
哇塞,n,m输反了都有93分,这数据有毒.
73296
zcy2333楼主2018/10/2 16:00

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

2018/10/2 16:00
加载中...