社区讨论

MLE 求条

P3731[HAOI2017] 新型城市化参与者 1已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@mlh9k69f
此快照首次捕获于
2026/02/11 08:00
4 周前
此快照最后确认于
2026/02/12 16:50
4 周前
查看原帖
rt,真找不出来,数组定的极限了,样例本地和 ide 没有任何问题,dfs 过程应该也没错,求 hack。
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+20,NN=1e4+20;
int to[N],nxt[N],head[NN],cap[N],cur[NN];
int tot;
int s,t;
void add_(int u,int v,int w)
{
	to[tot]=v;
	cap[tot]=w;
	nxt[tot]=head[u];
	head[u]=tot++;
}
void add(int u,int v,int w){add_(u,v,w),add_(v,u,w);}
int n,m,dis[NN];
bool bfs()
{
	queue<int> q;
	memset(dis,0,sizeof dis);
	memcpy(cur,head,sizeof head);
	q.push(s);
	dis[s]=1;
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		for(int j=head[u];~j;j=nxt[j])
		{
			int v=to[j];
			if(cap[j] and !dis[v])
			{
				dis[v]=dis[u]+1;
				q.push(v);
				if(v==t)return 1;
			}
		}
	}
	return 0;
}
int dfs(int u,int cf)
{
	if(u==t)return cf;
	int su=0;
	for(int j=cur[u];~j;j=nxt[j])
	{
		cur[u]=j;
		int v=to[j];
		if(cap[j] and dis[v]==dis[u]+1)
		{
			int k=dfs(v,min(cap[j],cf));
			cf-=k;
			cap[j]-=k;
			cap[j^1]+=k;
			su+=k;
			if(cf==0)break;
		}
	}
	if(su==0)dis[u]=0;
	return su;
}
set<pair<int,int> > st;
int mxflw;
void dinic()
{
	while(bfs())
		mxflw+=dfs(s,0x3f3f3f3f);
}
stack<int> sk;
int dfn[NN],low[NN],idx,bl[NN],vis[NN],cnt;
void tarjan(int u)
{
	dfn[u]=low[u]=++idx;
	sk.push(u);
	vis[u]=1;
	for(int j=head[u];~j;j=nxt[j])
	{
		int v=to[j];
		if(!cap[j])continue;
		if(!dfn[v])
		{
			tarjan(v);
			low[u]=min(low[u],low[v]);
		}
		else if(vis[v])low[u]=min(low[u],dfn[v]);
	}
	if(dfn[u]==low[u])
	{
		int now=sk.top();
		cnt++;
		do
		{
			now=sk.top();
			bl[now]=cnt;
			vis[now]=0;
			sk.pop();
		}
		while(now!=u);
	}
}
vector<int> g[NN];
int cl[NN];
void color(int u,int fa,int clr)
{
	cl[u]=clr;
	for(auto v:g[u])
	{
		if(v==fa)continue;
		color(v,u,clr^1);
	}
}
struct edge
{
	int u,v;
}e[N];
signed main()
{
	memset(head,-1,sizeof head);
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0),cerr.tie(0);
	cin>>n>>m;
	for(int i=1,u,v;i<=m;i++)
	{
		cin>>u>>v;
		g[u].push_back(v);
		g[v].push_back(u);
		e[i]={u,v};
	}
	s=n+1,t=n+2;
	for(int i=1;i<=n;i++)if(!cl[i])color(i,0,0);
	for(int i=1;i<=n;i++)
	{
		if(!cl[i])add(s,i,1);
		else add(i,t,1);
	}
	for(int i=1,u,v;i<=m;i++)
	{
		u=e[i].u,v=e[i].v;
		if(!cl[u])add(u,v,1);
		else add(v,u,1);
	}
	dinic();
	for(int i=1;i<=n+2;i++)
		if(!dfn[i])
			tarjan(i);
	for(int u=1;u<=n;u++)
	{
		for(int j=head[u];~j;j=nxt[j])
		{
			int v=to[j];
			if(!cap[j] and bl[u]!=bl[v] and v!=s and v!=t)
				st.insert({min(u,v),max(u,v)});
		}
	}
	cout<<st.size()<<'\n';
	for(auto [u,v]:st)cout<<u<<' '<<v<<'\n';
}

回复

5 条回复,欢迎继续交流。

正在加载回复...