为什么q.push(make_pair(-d[y],y));要-d[y]?
  • 板块P1342 请柬
  • 楼主brucelei658
  • 当前回复6
  • 已保存回复6
  • 发布时间2024/1/17 12:31
  • 上次更新2024/1/17 13:20:36
查看原帖
为什么q.push(make_pair(-d[y],y));要-d[y]?
778886
brucelei658楼主2024/1/17 12:31
#include<bits/stdc++.h>
using namespace std;
/*panda*/
#define pb push_back
#define pii pair<ll,ll>
#define f(i,a,b) for(ll i = a;i<=b;i++)
#define f_(i,a,b) for(ll i = a;i>=b;i--)
typedef long long ll;
typedef unsigned long long ull;
const ll N =2e6+10;
ll n,m;
ll final[N],k,d[N],d1[N];
bool f[N];
struct node{
	ll from,to,pre,len;
}ar[N];
struct node1{
	ll from,to,pre,len;
}br[N];
ll final1[N],k1;
void add(ll u,ll v,ll len){
	ar[++k] = {u,v,final[u],len};
	final[u] = k;
}
void add2(ll u,ll v,ll len){
	br[++k1] = {u,v,final1[u],len};
	final1[u] = k1;
}
void panda1(){
	priority_queue<pii,vector<pii> > hp;
	hp.push({0,1});
	memset(d,0x7f,sizeof(d));
	d[1] = 0;
	while(!hp.empty()){
		pii h = hp.top();
		hp.pop();
		ll dis = h.first,fr = h.second;
		if(f[fr])continue;
		f[fr] = 1;
		for(ll i = final[fr];i;i = ar[i].pre){
			ll to = ar[i].to;
			if(d[fr] + ar[i].len < d[to]){
				d[to] = d[fr] + ar[i].len;
				hp.push({-d[to],to});
			}
		}
	}
}
void panda2(){
	priority_queue<pii,vector<pii> > hp;
	memset(f,0,sizeof(f));
	hp.push({0,1});
	memset(d1,0x7f,sizeof(d1));
	d1[1] = 0;
	while(!hp.empty()){
		pii h = hp.top();
		hp.pop();
		ll dis = h.first,fr = h.second;
//		cout<<d[fr]<<fr<<" ";
		if(f[fr])continue;
		f[fr] = 1;
		for(ll i = final1[fr];i;i = br[i].pre){
			ll to = br[i].to;
			if(d1[fr] + br[i].len < d1[to]){
				d1[to] = d1[fr] + br[i].len;
				hp.push({-d1[to],to});
			}
		}
	}
}
int main(){
	cin>>n>>m;
	ll x,y,l;
	f(i,1,m){
		scanf("%lld%lld%lld",&x,&y,&l);
		add(x,y,l);
		add2(y,x,l);
	}
	panda1();
	ll ans = 0;
	panda2();
	f(i,1,n){
		ans += d[i]+d1[i];
	}
	cout<<ans;
	return 0;
}


不加负号就前三个点错

2024/1/17 12:31
加载中...