求助
  • 板块灌水区
  • 楼主Afoat
  • 当前回复2
  • 已保存回复2
  • 发布时间2020/10/19 17:34
  • 上次更新2023/11/5 10:24:10
查看原帖
求助
241036
Afoat楼主2020/10/19 17:34

P1073

缩点+DAGdp,WA了8个点

#include <bits/stdc++.h>
using namespace std;
int n,m;
struct Edge
{
	int fro;
	int des;
	int next;
}edge[1000100],eg[1000100];
struct Node
{
	int st;
	int point;
	int hst;
	int dfn;
	int low;
	int ins;
	int beti;
	int maxn;
	int minn;
	int premaxn;
	int preminn;
}node[100010];
int cnt;
int dfl;
int cnl;
int tail;
int sta[100010];
inline void _Add(int x,int y)
{
	cnt++;
	edge[cnt].fro=x;
	edge[cnt].des=y;
	edge[cnt].next=node[x].st;
	node[x].st=cnt;
	return;
}
inline void Input()
{
	scanf("%d %d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&node[i].maxn);
		node[i].minn=node[i].maxn;
	}
	for(int i=1;i<=m;i++)
	{
		int u,v,z;
		scanf("%d %d %d",&u,&v,&z);
		if(z==1)
		{
			_Add(u,v);
		}
		else
		{
			_Add(v,u);
			_Add(u,v);
		}
	}
	return;
}
void dfs(int poi)
{
	dfl++;
	node[poi].dfn=dfl;
	node[poi].low=dfl;
	node[poi].ins=1;
	tail++;
	sta[tail]=poi;
	
	for(int i=node[poi].st;i!=0;i=edge[i].next)
	{
		int flag=edge[i].des;
		if(node[flag].dfn==0)
		{
			dfs(flag);
			node[poi].low=min(node[flag].low,node[poi].low); 
		}
		else
		{
			if(node[flag].ins==1)
			{
				node[poi].low=min(node[flag].low,node[poi].low);
			}
		}
	}
	if(node[poi].dfn==node[poi].low)
	{
		while(sta[tail]!=poi)
		{
			node[poi].maxn=max(node[poi].maxn,node[sta[tail]].maxn);
			node[poi].minn=min(node[poi].minn,node[sta[tail]].minn);
			node[sta[tail]].beti=poi;
			node[sta[tail]].ins=0;
			tail--;
		}
		node[sta[tail]].beti=poi;
		node[sta[tail]].ins=0;
		tail--;
	}
	return;
}
void Pre()
{
	for(int i=1;i<=cnt;i++)
	{
		int u=node[edge[i].fro].beti;
		int v=node[edge[i].des].beti;
		if(u!=v)
		{
			cnl++;
			eg[cnl].des=v;
			eg[cnl].fro=u;
			eg[cnl].next=node[u].hst;
			node[v].point++;
			node[u].hst=cnl;
		}
	}
	return;
}
int ans;
struct SB
{
	int poi;
	int minn;
};
void tuopu()
{
	queue <SB> QUE;
	SB a;
	a.minn=node[1].minn;
	a.poi=1;
	QUE.push(a);
	for(int i=1;i<=n;i++)
	{
		if(node[i].beti==i)
		{
			node[i].preminn=node[i].minn;
		}
	}
	while(!QUE.empty())
	{
		SB rnm=QUE.front();
		QUE.pop();
		for(int i=node[rnm.poi].hst;i!=0;i=eg[i].next)
		{
			int flag=eg[i].des;
			ans=max(ans,node[flag].maxn-rnm.minn);
			node[flag].preminn=min(node[flag].preminn,rnm.minn);
			node[flag].point--;
			if(node[flag].point==0)
			{
				SB fuck;
				fuck.poi=flag;
				fuck.minn=node[flag].preminn;
				QUE.push(fuck);
			}
		}
	}
	printf("%d\n",ans);
	return;
}
int main()
{
//	freopen("trade.in","r",stdin);
//	freopen("trade.out","w",stdout);
	Input();
	for(int i=1;i<=n;i++)
	{
		if(node[i].dfn==0)
		{
			dfs(i);
		}
	}
	Pre();
	
	tuopu();
	return 0;
}
/*
5 5
4 3 5 6 1
1 2 1
1 4 1
2 3 1
3 5 1
4 5 2
*/

有点小离谱

2020/10/19 17:34
加载中...