求助大佬
查看原帖
求助大佬
544860
linyihdfj楼主2022/1/20 17:25

明明和题解没啥区别却总是 WA,求大佬帮忙看看是哪里出了问题

#include<bits/stdc++.h>
using namespace std;
struct edge{
	long long to,val;
	edge(long long b=0,long long c=0){
		to=b;val=c;
	}
};
struct edge2{
	long long from,to,val;
	edge2(long long a=0,long long b=0,long long c=0){
		from=a;to=b;val=c;
	}
};
bool operator < (edge l,edge r){
	return l.val > r.val;
}
bool cmp(edge2 l,edge2 r){
	return l.val < r.val;
}
long long n,m,k,q,lena,dis[500005],deep[500005],f[500005],fa[500005][30],g[500005][30];
bool vis[500005];
edge2 a[500005];
vector<edge> v[500005],v2[500005];
long long find(long long x){
	if(f[x] != x)
		return f[x] = find(f[x]);
	return x;
}
void dij(long long s){
	memset(vis,0,sizeof(vis));
	memset(dis,0x3f3f3f3f,sizeof(dis));
	priority_queue<edge> q;
	q.push(edge(s,0));
	dis[s]=0;
	while(!q.empty()){
		long long from=q.top().to;
		q.pop();
		if(vis[from])
			continue;
		vis[from]=1;
		for(long long i=0; i<v[from].size(); i++){
			long long to=v[from][i].to,val=v[from][i].val;
			if(vis[to])
				continue;
			if(dis[to] > dis[from] + val){
				dis[to] = dis[from] + val;
				q.push(edge(to,val));
			}
		}
	}
}
void kruskal(){
	for(int i=1; i<=n; i++){
		f[i]=i;
	}
	sort(a+1,a+m+1,cmp);
//	for(long long i=1; i<=lena; i++){
//		printf("%d %d %d\n",a[i].from,a[i].to,a[i].val);
//	}
//	cout<<endl;
	long long cnt=0;
	for(long long i=1; i<=m && cnt!=(n-1); i++){
		long long from=a[i].from,to=a[i].to;
		long long o=find(from),u=find(to);
		if(find(from) != find(to) && from!=0 && to!=0){
			v2[from].push_back(edge(to,a[i].val));
			v2[to].push_back(edge(from,a[i].val));
			f[find(from)] = find(to); 
			cnt++;
		}
	}
}
void dfs(long long now,long long now_fa){
	for(long long i=0; i<v2[now].size(); i++){
		long long to=v2[now][i].to,val=v2[now][i].val;
		if(to == now_fa)
			continue;
		fa[to][0]=now;  //记录父亲 
		g[to][0]=val;  //记录最大值最小的最大值
		deep[to]=deep[now]+1; 
//		printf("%d %d\n",now,to);
		dfs(to,now);
	}
}
void chuli(){
	for(long long i=1; i<=25; i++){
		for(long long j=1; j<=n; j++){
			fa[j][i] = fa[fa[j][i-1]][i-1];
			g[j][i] = max(g[j][i-1],g[fa[j][i-1]][i-1]);
		}
	}
}
long long get_ans(long long x,long long y){
	long long cnt=-1e18;
	if(deep[x] > deep[y])
		swap(x,y);
	for(long long i=25; i>=0; i--){
		if(deep[fa[y][i]] >= deep[x]){
			cnt=max(cnt,g[y][i]);
			y=fa[y][i];
		}
	}
	if(x == y)
		return cnt;
	for(long long i=25; i>=0; i--){
		if(fa[x][i] != fa[y][i]){
			cnt=max(cnt,max(g[x][i],g[y][i]));
			x=fa[x][i];
			y=fa[y][i];
		}
	}
	return max(cnt,max(g[y][0],g[x][0]));
}
int main(){
//	freopen("in.txt","r",stdin);
//	freopen("out.txt","w",stdout);
	cin>>n>>m>>k>>q;
	for(long long i=1; i<=m; i++){
		long long from,to,val;
		cin>>from>>to>>val;
		v[from].push_back(edge(to,val));
		v[to].push_back(edge(from,val));
		a[i].from=from;a[i].to=to;a[i].val=val;
	}
	for(long long i=1; i<=k; i++){
		v[0].push_back(edge(i,0));
		v[i].push_back(edge(0,0));
	}
	for(long long i=1; i<=n; i++)
		f[i]=i;
	dij(0);
	for(int i=1; i<=m; i++){
		a[i].val+=dis[a[i].from] + dis[a[i].to];
	}
	kruskal();
	deep[1]=1;
	dfs(1,-1);
	chuli();
	for(long long i=1; i<=q; i++){
		long long from,to;
		cin>>from>>to;
		long long ans=get_ans(from,to);
		cout<<ans<<endl;
	}
	return 0;
}
2022/1/20 17:25
加载中...