#3 MLE求助!!
查看原帖
#3 MLE求助!!
401052
Endline楼主2022/1/18 11:47

RT

CodeCode:

#include<bits/stdc++.h>
#define MAXN 600020
using namespace std;
inline int read()
{
	int f=1,w=0;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9')w=w*10+ch-'0',ch=getchar();
	return f*w;
}
int n,m,c;
int dfn[MAXN],low[MAXN],num,belong[MAXN],scc;
int d[MAXN];
int head[MAXN],Head[MAXN],cnt;
int stk[MAXN],top;
bool vis[MAXN];
struct node
{
	int to,next;
}edge[MAXN],Edge[MAXN];
void add(int x,int y)
{
	edge[++cnt].to=y;
	edge[cnt].next=head[x];
	head[x]=cnt;
	return;
}
void Add(int x,int y)
{
	Edge[++cnt].to=y;
	Edge[cnt].next=Head[x];
	Head[x]=cnt;
	return;
}
void tarjan(int x,int fa)
{
	dfn[x]=low[x]=++num;
	stk[++top]=x;
	vis[x]=1;
	for(int i=head[x];i;i=edge[i].next)
	{
		int y=edge[i].to;
		if(y==fa)continue;
		if(!dfn[y])
		{
			tarjan(y,x);
			low[x]=min(low[x],low[y]);
		}
		else if(vis[y])low[x]=min(low[x],dfn[y]);
	}
	if(low[x]==dfn[x])
	{
		scc++;
		while(stk[top]!=x)
		{
			int y=stk[top--];
			belong[y]=scc;
			vis[y]=false;
		}
		top--;
		belong[x]=scc;
		vis[x]=false;
	}
}
void dfs(int u,int fa)
{
    d[u]=d[fa]+1;
	for (int i=Head[u];i;i=Edge[i].next)
	{
		int v=belong[Edge[i].to];
    	if(v!=fa)dfs(v,u);
  	}
}
int main()
{
	n=read(),m=read();
	for(int i=1;i<=m;i++)
	{
		int u=read(),v=read();
		add(u,v);add(v,u);
	}
	for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i,0);
	cnt=0;
	for(int u=1;u<=n;u++)
	{
		int p=belong[u];
		for(int i=head[u];i;i=edge[i].next)
		{
			int v=edge[i].to;
			int q=belong[v];
			if(p!=q)Add(p,q);
		}
	}
	dfs(1,0);
	int c=1;
	for(int i=1;i<=scc;i++)
		if(d[i]>d[c])c=i;
	dfs(c,0);
	c=0;
	for(int i=1;i<=scc;i++)
		c=max(c,d[i]);
	cout<<c-1;
	return 0;
} 

2022/1/18 11:47
加载中...