为什么本题的新图建双向边是错的
查看原帖
为什么本题的新图建双向边是错的
339299
osfly楼主2024/11/6 20:48
#include<bits/stdc++.h>
using namespace std;

#define ll long long

const int N=1e6+10;

int read()
{
	int res=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9')
	{
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		res=(res<<3)+(res<<1)+ch-'0';
		ch=getchar();
	}
	return res*f;
}

int n,m,p;

struct graph
{
	struct edge
	{
		int u,v,nxt;
	}e[N<<1];
	int head[N],tot=1;
	void add(int u,int v)
	{
		e[++tot]=edge{u,v,head[u]};
		head[u]=tot;
	}
}g[2];

int dfn[N],low[N],cur;
int brg[N];
void tarjan(int u)
{
	dfn[u]=low[u]=++cur;
	for(int i=g[0].head[u];i;i=g[0].e[i].nxt)
	{
		int v=g[0].e[i].v;
		if(!dfn[v])
		{
			tarjan(v);
			low[u]=min(low[u],low[v]);
			if(low[v]>=dfn[u]) brg[i]=brg[i^1]=1;
		}
		else low[u]=min(low[u],dfn[v]);
	}
}

int col,bel[N];
void dfs1(int u)
{
	bel[u]=col;
	for(int i=g[0].head[u];i;i=g[0].e[i].nxt)
	{
		int v=g[0].e[i].v;
		if(bel[v]||brg[i]) continue;
		dfs1(v);
	}
}

int ans[N];

int dep[N];
void dfs2(int u,int f)
{
	dep[u]=dep[f]+1;
	for(int i=g[1].head[u];i;i=g[1].e[i].nxt)
	{
		int v=g[1].e[i].v;
		if(v==f) continue;
		dfs2(v,u);
		ans[u]+=ans[v];
	}
}

int main()
{
	n=read(),m=read();
	for(int i=1,u,v;i<=m;i++)
	{
		u=read(),v=read();
		g[0].add(u,v),g[0].add(v,u);
	}
	for(int i=1;i<=n;i++)
		if(!dfn[i]) tarjan(i);
	for(int i=1;i<=n;i++)
		if(!bel[i]) col++,dfs1(i);
	for(int u=1;u<=n;u++)
		for(int i=g[0].head[u];i;i=g[0].e[i].nxt)
		{
			int v=g[0].e[i].v;
			if(bel[u]!=bel[v]) g[1].add(bel[u],bel[v]);
		}
	p=read();
	while(p--) ans[bel[read()]]++,ans[bel[read()]]--;
	for(int i=1;i<=col;i++)
		if(!dep[i]) dfs2(i,0);
	for(int i=2;i<=g[0].tot;i+=2)
	{
		int u=g[0].e[i].u,v=g[0].e[i].v;
		if(bel[u]==bel[v]) printf("B");
		else
		{
			u=bel[u],v=bel[v];
			if(dep[u]<dep[v]) printf(ans[v]>0?"L":(ans[v]<0?"R":"B"));
			else printf(ans[u]>0?"R":(ans[u]<0?"L":"B"));
		}
	}
	return 0;
}

RT,这是本人代码,在第102行中如果建的是双向边就会TLE。

个人不是很能理解建单向边的正确性。

2024/11/6 20:48
加载中...