30分求助,WA on #90 #91
查看原帖
30分求助,WA on #90 #91
510957
DeepSeaSpray楼主2025/2/6 14:58
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define P pair<ll,ll>
#define fir first
#define sec second
const int maxn=1e6;
int n,m;
vector<P> E[maxn+5];
bool vis[maxn+5];
ll dis[maxn+5];
priority_queue<P,vector<P>,greater<P>> pq;
int tot;
int dfn[maxn+5],low[maxn+5],idt;
int st[maxn+5],top;
vector<int> V[maxn+5];
map<int,ll> mp[maxn+5];
queue<int> qu;
inline void Dij(){
	int u,v;ll w;
	memset(dis,0x3f,sizeof(dis));
	dis[1]=0,pq.push(P(0,1));
	while(pq.size()){
		u=pq.top().sec,pq.pop();
		if(vis[u]) continue;
		vis[u]=1;
		for(P t:E[u]){
			v=t.fir,w=t.sec;
			if(dis[v]>dis[u]+w){
				dis[v]=dis[u]+w;
				pq.push(P(dis[v],v));
			}
		}
	}
}
void Dfs(int u,int fa){
	dfn[u]=low[u]=++idt;
	int v;
	st[++top]=u;
	for(P t:E[u]){
		v=t.fir;
		if(!dfn[v]){
			Dfs(v,u);
			low[u]=min(low[u],low[v]);
			if(low[v]>=dfn[u]){
				tot++;
				while(true){
					V[tot].emplace_back(st[top]);
					if(st[top--]==v) break;
				}
				V[tot].emplace_back(u);
			}
		}
		else if(v!=fa) low[u]=min(low[u],dfn[v]);
	}
}
inline void Update(int u){
	if(1<u&&u<n&&1<=mp[u].size()&&mp[u].size()<=2)
		qu.push(u);
}
inline void Insert(int u,int v,ll w){
	if(mp[u].count(v)){
		if(mp[u][v]!=w)
			mp[u][v]=-1;
	}
	else mp[u][v]=w;
	mp[v][u]=w;
}
inline void Delete(int u,int v){
	mp[u].erase(v);
	mp[v].erase(u);
	Update(u),Update(v);
}
signed main(){
	freopen("P8426_90.in","r",stdin);
	int u,v,x;ll w,y;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		scanf("%d%d%lld",&u,&v,&w);
		E[u].emplace_back(P(v,w));
		E[v].emplace_back(P(u,w));
	}
	Dij();
	E[1].emplace_back(P(n,dis[n]));
	E[n].emplace_back(P(1,dis[n]));
	for(int i=1;i<=n;i++){
		if(dfn[i]) continue;
		top=0;
		Dfs(i,0);
	}
	for(int i=1;i<=tot;i++){
		bool flg1=0,flg2=0;
		for(int j:V[i]){
			flg1|=(j==1);
			flg2|=(j==n);
		}
		if(flg1&&flg2){
			memset(vis,0,sizeof(vis));
			for(int j:V[i]) vis[j]=1;
			for(int j:V[i]){
				for(P k:E[j]){
					if(vis[k.fir]){
						Insert(j,k.fir,k.sec);
						
					}
				}
			}
			for(int j:V[i]) Update(j);
			break;
		}
	}
	while(qu.size()){
		u=qu.front(),qu.pop();
		if(mp[u].size()==1)
			Delete(u,(*mp[u].begin()).fir);
		if(mp[u].size()==2){
			v=(*mp[u].begin()).fir;
			w=(*mp[u].begin()).sec;
			x=(*mp[u].rbegin()).fir;
			y=(*mp[u].rbegin()).sec;
			if(w==-1||y==-1) Insert(v,x,-1);
			else Insert(v,x,w+y);
			Delete(u,v);
			Delete(u,x);
		}
	}
	if(mp[1].size()==1&&mp[1][n]!=-1) puts("0");
	else puts("1");
	return 0;
}
2025/2/6 14:58
加载中...