45pts求条
查看原帖
45pts求条
615573
HopeIsntHere楼主2024/9/7 15:03
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e5+99,M=1e6+99;
int n,m,s,t;
struct edge{
	int v,w,nxt;
}edg[M*2];
int hd[N],cntedge=1;
void add(int u,int v,int w){
	++cntedge;
	edg[cntedge]=(edge){v,w,hd[u]};
	hd[u]=cntedge;
}
struct node{
	int u; ll dis;
	bool operator <(const node&A) const{
		return dis>A.dis;
	}
};
ll d[N];
void dij(){
	memset(d,0x3f3f3f,sizeof(d));
	priority_queue<node> que;
	d[s]=0; que.push((node){s,d[s]});
	node now; int u,v,w;
	while(!que.empty()){
		now=que.top(); que.pop();
		u=now.u; if(d[u]!=now.dis) return;
		for(int i=hd[u];i;i=edg[i].nxt){
			v=edg[i].v; w=edg[i].w;
			if(d[v]<=d[u]+w) continue;
			d[v]=d[u]+w; que.push((node){v,d[v]});
		}
	}
	return;
}
int dfn[N],low[N],timer,idfn[N];
void dfs(int u,int eid){
	dfn[u]=low[u]=++timer; idfn[timer]=u;
	int v;
	for(int i=hd[u];i;i=edg[i].nxt){
		if((i^1)==eid) continue;
		v=edg[i].v;
		if(dfn[v]) low[u]=min(low[u],dfn[v]);
		else dfs(v,i),low[u]=min(low[u],low[v]);
	}
	return;
}
void dfss(int u,int dis){
	d[u]=dis;
	int v,w;
	for(int i=hd[u];i;i=edg[i].nxt){
		v=edg[i].v; w=edg[i].w;
		if(w!=1||d[v]) continue;
		dfss(v,dis+1);
	}
}
int fro[N],bac[N];
ll f[N][4];
void chkmn(ll &x,ll y){
	if(y<x) x=y;
	return;
} 
void solve(){
	dfss(s,1);
	int u,v,w;
	for(int i=1;i<=n;i++){
		for(int j=hd[i];j;j=edg[j].nxt){
			v=edg[j].v; w=edg[j].w;
			if(w==1) continue;
			v=d[v]; u=d[i];
			if(v>u) bac[u]=w;
			else fro[u]=1;
		}
	}
	memset(f,0x3f3f,sizeof(f));
	f[1][0]=f[1][1]=f[1][2]=f[1][3]=0;
 	for(int i=1;i<=n;i++){
 		if(fro[i+1]){
			chkmn(f[i+1][0],f[i][0]+1);
			chkmn(f[i+1][2],f[i][1]+1);
			chkmn(f[i+1][1],f[i][2]+1);
			chkmn(f[i+1][3],f[i][3]+1);
		 }
		else{
			chkmn(f[i+1][1],f[i][0]+1);
			chkmn(f[i+1][3],f[i][1]+1);
		}
		if(bac[i]){
			chkmn(f[i+2][0],f[i][0]+bac[i]);
			if(fro[i+1]) chkmn(f[i+2][0],f[i][1]+bac[i]);
			if(fro[i+1]) chkmn(f[i+2][0],f[i][2]+bac[i]);
		}
	}
	ll ans=f[n][0];
	cout<<ans;
	return;
}
int main(){
//	freopen("road.in","r",stdin);
//	freopen("road.out","w",stdout);
	std::ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>n>>m;
	int u,v,w,ww,b=1;
	for(int i=1;i<=m;i++){
		cin>>u>>v>>w;
		if(i==1) ww=w;
		else if(ww!=w) b=0; 
		add(u,v,w);
		add(v,u,w);
	}
	cin>>s>>t;
	dfs(s,0);
	u=t;
	while(low[u]!=dfn[u])
		u=idfn[low[u]];
	if(u!=s)
		cout<<-1;
	else{
		if(b) dij(),cout<<d[t];
		else solve();
	}
	return 0;
}
2024/9/7 15:03
加载中...