求助,spfa跑法,全wa
查看原帖
求助,spfa跑法,全wa
366746
烛木楼主2020/10/17 11:37

正反向各一次spfa,然后枚举每一条边,全wa

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<queue>
#define int long long
#define MAXN 1000086
using namespace std;
int n,m,tot,xx[MAXN],yy[MAXN];
int sdn,cnt,tt,sddis[MAXN],dfn[MAXN],low[MAXN],vis[MAXN],stack[MAXN],col[MAXN];
int dis1[MAXN],dis2[MAXN];
struct node
{
	int first,next,go;
}p[MAXN];
queue<int>q;
inline void star(int a,int b)
{
	p[++tot].next=p[a].first;
	p[a].first=tot;
	p[tot].go=b;
}
inline void tarjan(int x)
{
	stack[++cnt]=x;
	low[x]=dfn[x]=++tt;
	vis[x]=1;
	for(int i=p[x].first;i;i=p[i].next)
	{
		int y=p[i].go;
		if(!dfn[y])
		{
			tarjan(y);
			low[x]=min(low[x],low[y]);
		}
		else if(vis[y]) low[x]=min(low[x],dfn[y]);
	}
	if(dfn[x]==low[x])
	{
		++sdn;
		int v;
		do
		{
			v=stack[cnt--];
			vis[v]=0;
			col[v]=sdn;
		}while(v!=x);
	}
}
inline void spfa(int *dis,int a)
{
	dis[a]=sddis[a];
	q.push(a);
	while(!q.empty())
	{
		int x=q.front();
		q.pop();
		vis[x]=0;
		for(int i=p[x].first;i;i=p[i].next)
		{
			int y=p[i].go;
			if(dis[x]+sddis[y]>dis[y])
			{
				dis[y]=dis[x]+sddis[y];
				if(!vis[y])
				{
					vis[y]=1;
					q.push(y);
				}
			}
		}
	}
}
signed main()
{
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=m;i++)
	{
		scanf("%lld%lld",&xx[i],&yy[i]);
		star(xx[i],yy[i]);
	}
	for(int i=1;i<=n;i++)
	{
		if(!dfn[i]) tarjan(i);
	}
	for(int i=1;i<=n;i++) ++sddis[col[i]];
	memset(p,0,sizeof(p));
	memset(vis,0,sizeof(vis));
	tot=0;
	for(int i=1;i<=m;i++)
	{
		if(col[xx[i]]!=col[yy[i]])
		star(col[xx[i]],col[yy[i]]);
	}
	spfa(dis1,1);
	memset(p,0,sizeof(p));
	memset(vis,0,sizeof(vis));
	tot=0;
	for(int i=1;i<=m;i++)
	{
		if(col[xx[i]]!=col[yy[i]])
		star(col[yy[i]],col[xx[i]]);
	}
	spfa(dis2,1);
	int ans=0;
	for(int i=1;i<=m;i++)
	{
		if(col[xx[i]]!=col[yy[i]])
		{
			ans=max(ans,dis1[col[xx[i]]]+dis2[col[yy[i]]]);
			//printf("%lld  %lld  %lld  %lld\n",col[yy[i]],dis1[col[yy[i]]],col[xx[i]],dis2[col[xx[i]]]);
		}
	}
	printf("%lld",ans);
	return 0;
}
2020/10/17 11:37
加载中...