求助,不知为何而对
查看原帖
求助,不知为何而对
750240
Hellsing_Alucard楼主2023/3/22 22:06

写了一遍 spfaspfa

发现会Wa两个点,然后感觉是因为这一句没有更新完

dis2[v]=min(dis2[v],dis2[u]+w);

于是又跑了一遍(正着跑),不知道为什么对了

大概因为数据过水,请帮忙hack一下,如果有正确性

麻烦请帮忙解释一下

#include<bits/stdc++.h>

using namespace std;

#define int long long

const int mod=1e9+7;

inline int read(){
	int u=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){u=u*10+ch-48;ch=getchar();}
	return u*f;
}
int n,m;
queue<int>q;
vector<pair<int,int> >vec[500500];
int dis[500500],dis2[500500];
bool vis[500500];
inline void spfa(){
	memset(dis,0x3f,sizeof dis);
	memset(dis2,0x3f,sizeof dis2);
	q.push(1);
	vis[1]=1;
	dis[1]=0;
	while(q.size()){
		int u=q.front();q.pop();
		vis[u]=0;
		for(auto i:vec[u]){
			int v=i.first,w=i.second;
			if(dis[v]<dis[u]+w){
				dis2[v]=min(dis2[v],dis[u]+w);
				//cout<<v<<" "<<dis2[v]<<endl;
			}
			dis2[v]=min(dis2[v],dis2[u]+w);
			if(dis[v]>dis[u]+w){
				dis2[v]=min(dis2[v],dis[v]);
				//cout<<v<<" "<<dis2[v]<<endl;
				dis[v]=dis[u]+w;
				if(!vis[v]){
					vis[v]=1;
					q.push(v);
				}
			}
		}
	}
	memset(dis,0x3f,sizeof dis);
	//memset(dis2,0x3f,sizeof dis2);
	q.push(1);
	vis[1]=1;
	dis[1]=0;
	while(q.size()){
		int u=q.front();q.pop();
		vis[u]=0;
		for(auto i:vec[u]){
			int v=i.first,w=i.second;
			if(dis[v]<dis[u]+w){
				dis2[v]=min(dis2[v],dis[u]+w);
				//cout<<v<<" "<<dis2[v]<<endl;
			}
			dis2[v]=min(dis2[v],dis2[u]+w);
			if(dis[v]>dis[u]+w){
				dis2[v]=min(dis2[v],dis[v]);
				//cout<<v<<" "<<dis2[v]<<endl;
				dis[v]=dis[u]+w;
				if(!vis[v]){
					vis[v]=1;
					q.push(v);
				}
			}
		}
	}
}
signed main(){
	n=read();m=read();
	for(int i=1,u,v,w;i<=m;i++){
		u=read();v=read();w=read();
		vec[u].push_back({v,w});
		vec[v].push_back({u,w});
	}
	spfa();
	cout<<dis2[n]<<endl;
    return 0;
}
2023/3/22 22:06
加载中...