MLE#1+WA#2,6 求调
查看原帖
MLE#1+WA#2,6 求调
928972
ny_Dacong楼主2025/1/30 15:49
#include<bits/stdc++.h>
using namespace std;
long long n,m;
vector<pair<long long,long long>> org[1000050];
long long dtot = 0,stot = 0,low[1000050],dfn[1000050];
long long belong[1000050];
stack<long long> que;
bitset<1000050> inque;
void tarjan(long long now,long long fa){
	dfn[now] = low[now] = ++dtot;
	que.push(now);
	inque[now] = 1;
	bool visfa = 0;
	for(auto i:org[now]){
		if(!inque[i.first]){
			tarjan(i.first,now);
			low[now] = min(low[now],low[i.first]);
		}else if(dfn[i.first]){
			if(i.first != fa || visfa){
				low[now] = min(low[now],dfn[i.first]);
			}else{
				visfa = 1;
			}
		}
	}
	if(low[now] == dfn[now]){
		long long y;
		stot++;
		do{
			y = que.top();
			que.pop();
			inque[y] = 0;
			belong[y] = stot;
		}while(y != now);
	}
	return;
}
struct edges{
	long long Start,End,Len;
}edge[4000050];
long long etot = 0;
long long Last[1000050],Next[4000050],End[4000050];
unordered_set<long long> s;
void addedge(long long u,long long v,long long c){
	if(s.count(belong[u]*1000050ll+belong[v])){
		return;
	}
//	printf("%lld %lld %lld\n",u,v,c);
	etot++;
	edge[etot].Start = u;
	edge[etot].End = v;
	edge[etot].Len = c;
	Next[etot] = Last[u];
	Last[u] = etot;
	End[etot] = v;
	s.insert(belong[u]*1000050ll+belong[v]);
	return;
}
long long color[1000050],l = 0,r = 0;
long long dfs(long long now,long long fa){
	if(now == l){
		return 1;
	}
	if(now == r){
		return 2;
	}
	if(color[now]){
		return 0;
	}
	for(long long i = Last[now]; i; i = Next[i]){
		if(End[i] == fa){
			continue;
		}
		static long long tp;
		tp = dfs(End[i],now);
		if(tp){
			color[now] = 1;
			return tp;
		}
	}
	return 0;
}
int main(){
	scanf("%lld%lld",&n,&m);
	while(m--){
		static long long tpa,tpb,tpc;
		scanf("%lld%lld%lld",&tpa,&tpb,&tpc);
		org[tpa].push_back({tpb,tpc});
		org[tpb].push_back({tpa,tpc});
	}
	for(long long i = 1; i <= n; i++){
		if(!dfn[i]){
			tarjan(i,0);
		}
	}
	if(stot == 1){
		puts("-1");
		return 0;
	}
	for(long long i = 1; i <= n; i++){
		for(auto j:org[i]){
			addedge(belong[i],belong[j.first],j.second);
		}
	}
	sort(edge+1,edge+1+etot,[](edges x,edges y) -> bool{return x.Len < y.Len;});
	l = edge[1].Start;
	r = edge[1].End;
	color[edge[1].Start] = color[edge[1].End] = 1;
	for(long long i = 2; i <= etot; i++){
		static long long tp;
		if(color[edge[i].Start]){
			continue;
		}
		tp = dfs(edge[i].Start,-114);
		if(tp == 0){
			printf("%lld",edge[i].Len);
			return 0;
		}
		if(tp == 1){
			l = edge[i].Start;
		}else{
			r = edge[i].Start;
		}
		color[edge[i].Start] = 1;
	}
	puts("-1");
	return 0;
}

如果哪里没看懂可以问,在线等。

回复时记得 @ 我,不然我可能注意不到。

2025/1/30 15:49
加载中...