勉强过了,但第八个点正好1s,擦着时限,求助
查看原帖
勉强过了,但第八个点正好1s,擦着时限,求助
342494
wxh666楼主2023/5/1 09:58

正好一秒过了

正好一秒T了

不知道怎么这么耗时

#include<bits/stdc++.h> 
using namespace std;
typedef int lsqxx;
struct lq{
	lsqxx v,nxt;
}e[500005];
lsqxx h[1005],cnt;
void add(int u,int v)
{
	e[++cnt].v=v;e[cnt].nxt=h[u];h[u]=cnt;
}
int re[1005],vis[1005],dis[1005];
int dt[505][505];
int n,m,E,ans;
int x,y;
int flag=0;
bool dfs(int t)
{
	for(int i=h[t];i;i=e[i].nxt)
	{
		int v=e[i].v;
		if(re[v]==t) continue;
		if(dis[v]) continue;
		dis[v]=1;
		if(!vis[v])
		{
			re[v]=t;
			vis[v]=1;
			return true;
		}
		else
		{
			if(dfs(re[v]))
			{
				dis[v]=1;
				vis[v]=1;
				re[v]=t;
				return true;
			}
		}
	}
	return false;
}
int main()
{
	cin>>n>>m>>E;
	for(int i=1;i<=E;i++)
	{
		scanf("%d%d",&x,&y);
		if(dt[x][y])
			continue;
		else
			add(x,y+n),dt[x][y]=1;
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=h[i];j;j=e[j].nxt)
		{
			int v=e[j].v;
			if(!vis[v])
			{
				re[v]=i;
				vis[v]=1;
				ans++;
				break;
			}
			else
			{
				memset(dis,0,sizeof(dis));
				dis[v]=1;
				if(dfs(re[v]))
				{
					ans++;
					vis[v]=1;
					re[v]=i;
					break;
				}
				else
					continue;
			}
		}
	}
	cout<<ans;
	return 0;
}
2023/5/1 09:58
加载中...