[CF1407E] Egor in the Republic of Dagestan

\(\text{Problem}:\)题目链接

\(\text{Solution}:\)

考虑一个点 \(x\) 的颜色对答案造成的影响:与 \(1\rightarrow x\) 的最短路无关,与 \(x\rightarrow n\) 的最短路有关。所以可以利用 \(x\rightarrow n\) 的状态去确定 \(x\) 的颜色。那么我们建出反图,从 \(n\) 点出发。如果在反图上,\(y\rightarrow x\) 这条边的颜色只有一种,那么 \(x\) 取和这条边颜色相反的颜色;否则,\(x\) 的颜色可以随便钦定,并更新 \(n\rightarrow x\) 的最短路。最终 \(dis_{1}\) 就是答案。

\(\text{Code}:\)

#include <bits/stdc++.h>
#pragma GCC optimize(3)
#define int long long
#define ri register
#define mk make_pair
#define fi first
#define se second
#define pb push_back
#define eb emplace_back
#define is insert
#define es erase
using namespace std; const int N=500010;
inline int read()
{
	int s=0, w=1; ri char ch=getchar();
	while(ch<'0'||ch>'9') { if(ch=='-') w=-1; ch=getchar(); }
	while(ch>='0'&&ch<='9') s=(s<<3)+(s<<1)+(ch^48), ch=getchar();
	return s*w;
}
int n,m,c[N],dis[N],book[N];
int head[N],maxE; struct Edge { int nxt,to,rdis; }e[N<<1];
inline void Add(int u,int v,int w) { e[++maxE].nxt=head[u]; head[u]=maxE; e[maxE].to=v; e[maxE].rdis=w; }
struct Node { int x,w; inline bool operator < (const Node& a) const { return w>a.w; } };
priority_queue<Node> Q;
signed main()
{
	n=read(), m=read();
	for(ri int i=1;i<=m;i++)
	{
		int u,v,w;
		u=read(), v=read(), w=read();
		Add(v,u,w);
	}
	memset(dis,0x3f,sizeof(dis));
	dis[n]=0;
	memset(c,-1,sizeof(c));
	c[n]=0, Q.push((Node){n,0});
	while(!Q.empty())
	{
		Node now=Q.top(); Q.pop();
		int x=now.x;
		if(book[x]) continue;
		book[x]=1;
		for(ri int i=head[x];i;i=e[i].nxt)
		{
			int v=e[i].to;
			if(c[v]==-1||c[v]!=e[i].rdis) c[v]=(!e[i].rdis);
			else
			{
				if(dis[v]>dis[x]+1)
				{
					dis[v]=dis[x]+1;
					Q.push((Node){v,dis[v]});
				}
			}
		}
	}
	if(dis[1]>=1e18) puts("-1");
	else printf("%lld\n",dis[1]);
	for(ri int i=1;i<=n;i++) printf("%lld",(~c[i])?(c[i]):(0));
	puts("");
	return 0;
}
posted @ 2021-02-28 20:01  zkdxl  阅读(51)  评论(0编辑  收藏  举报