自闭蒟蒻求助,只有21分,WA
查看原帖
自闭蒟蒻求助,只有21分,WA
196899
lndjy楼主2020/5/18 12:23

闰土,我用的tarjan+SPFA

#include<iostream>
#include<cstdio>
#include<stack>
#include<queue>
using namespace std;
int inline read()
{
	int ans=0,f=1;
	char ch=getchar();
	while(!isdigit(ch))
	{
		if(ch=='-')
		f=-1;
		ch=getchar();
	}
	while(isdigit(ch))
	{
		ans=ans*10+ch-'0';
		ch=getchar();
	}
	return ans*f;
}
const int N=100005;
struct edge
{
	int to,nxt;
}e[N];
int n,m,cnt,head[N];
void add(int u,int v)
{
	cnt++;
	e[cnt].to=v;
	e[cnt].nxt=head[u];
	head[u]=cnt;
}
int dfn[N],low[N],col[N],colw[N],sum,tot;
stack<int> s;
bool v[N];
void dfs(int now)
{
	tot++;
	dfn[now]=low[now]=tot;
	s.push(now);
	v[now]=1;
	for(int i=head[now];i;i=e[i].nxt)
	{
		if(!dfn[e[i].to])
		{
			dfs(e[i].to);
			low[now]=min(low[now],low[e[i].to]);
		}
		else if(v[e[i].to])
		{
			low[now]=min(low[now],dfn[e[i].to]);
		}
	}
	if(low[now]==dfn[now])
	{
		int x;
		sum++;
		do
		{
			x=s.top();
			s.pop();
			col[x]=sum;
			v[x]=0;
			colw[sum]++;
		}while(now!=x);
	}
}
struct dag
{
	#define e ee
	#define head headd
	#define cnt cntt
	struct node
	{
		int to,nxt,v;
	}e[N*4];
	int head[N*2],cnt;
	void add(int u,int v,int w)
	{
		cnt++;
		e[cnt].to=v;
		e[cnt].v=w;
		e[cnt].nxt=head[u];
		head[u]=cnt;
	}
	int dis[2*N];
	bool inq[2*N];
	int spfa()
	{
		queue<int> q;
		q.push(col[1]);
		dis[col[1]]=0;
		while(!q.empty())
		{
			int now=q.front();q.pop();
			inq[now]=0;
			for(int i=head[now];i;i=e[i].nxt)
			{
				if(dis[e[i].to]<dis[now]+e[i].v)//最长路 
				{
					dis[e[i].to]=dis[now]+e[i].v;
					if(!inq[e[i].to])
					{
						inq[e[i].to]=1;
						q.push(e[i].to);
					}
				}
			}
		}
		return dis[col[1]+sum];
	}
	#undef e
	#undef head
	#undef cnt
}ans;
int main()
{
	n=read();m=read();
	for(int i=1;i<=m;i++)
	{
		int a=read(),b=read();
		add(a,b);
	}
	for(int i=1;i<=n;i++)
	if(!dfn[i]) dfs(i);
	for(int i=1;i<=n;i++)
	for(int j=head[i];j;j=e[j].nxt)
	{
		if(col[i]!=col[e[j].to])
		{
			ans.add(col[i],col[e[j].to],colw[i]);
			ans.add(col[i]+sum,col[e[j].to]+sum,colw[i]);
			ans.add(col[e[j].to],col[i]+sum,colw[i]);
		}
	}
	cout<<ans.spfa();
	return 0;
}
2020/5/18 12:23
加载中...