不太理解为什么直接用最短路会wa
查看原帖
不太理解为什么直接用最短路会wa
760859
Let_Fly楼主2023/6/24 13:43

直接存下入边在队里,枚举出边,取max加入点权 求指教

#include<bits/stdc++.h>
using namespace std;
const int N=100005;
struct Dj{
	int dis,nh,bh;//dis,点编号,从哪条边来的编号
	bool friend operator <(Dj x,Dj y){
		return x.dis>y.dis;
	}
};
int wei[2*N];
vector<int> to[N];
map<pair<int,int> ,int> bq;
int d[N];
bool vis[N];
int n,m,nn,ans=9999999;

int main(){
	cin>>n>>m;
	memset(d,127,sizeof(d));
	for(int i=1;i<=m;i++){
		int p1,p2,we;
		cin>>p1>>p2>>we;
		to[p1].push_back(p2);
		to[p2].push_back(p1);
		bq[make_pair(p1,p2)]=i;
		bq[make_pair(p2,p1)]=i;
		wei[i]=we;
	}
//	for(int i=1;i<=n;i++){
//		to[i].push_back(n+1);
//		to[0].push_back(i);
//	}
	priority_queue<Dj> q;
	q.push({0,1,0});
	d[1]=0;
	while(!q.empty()){
		Dj nw=q.top();
		q.pop();
		//cout<<nw.dis<<' '<<nw.nh<<' '<<nw.bh<<'\n';
		if(nw.nh==n){
			ans=min(ans,d[n]+wei[nw.bh]);
			//break;
		}
		if(vis[nw.nh]){
			continue;
		}
		vis[nw.nh]=1;
		auto &v=to[nw.nh];
		for(int i=0;i<v.size();i++){
			if(!vis[v[i]]){
				int nbq=bq[make_pair(nw.nh,v[i])];
				if(d[v[i]]>d[nw.nh]+max(wei[nw.bh],wei[nbq])){
					d[v[i]]=d[nw.nh]+max(wei[nw.bh],wei[nbq]);
				}
				q.push({d[v[i]],v[i],nbq});
				nn=nbq;
			}
		}
	}
	cout<<ans;
	return 0;
}
2023/6/24 13:43
加载中...