萌新求助简单较短路板子题。
查看原帖
萌新求助简单较短路板子题。
455490
Sharpsmile楼主2024/1/7 21:53

不知道哪里错了 qwq

大佬帮帮 qwq

#include <bits/stdc++.h>
#define int long long
#define double long double 
#define endl "\n"
#define pii pair<double,int>
#define p1(x) ((x).first)
#define p2(x) ((x).second)
#define ls(x) T[x].ls
#define rs(x) T[x].rs
#define ds(x) T[x].ds
#define w(x) T[x].e.w
#define t(x) T[x].e.v
#define i128 __int128_t
using namespace std;
int n,m;
double K;
struct EDGE{int u,v;double w;

	EDGE(int U=0,int V=0,double W=0){
		v=V,u=U,w=W;
	}
}E[200020];
int cnt=0;
struct edge{int v,id;double w;
	edge(int V=0,int ID=0,double W=0){
		v=V,id=ID,w=W;
	}
};
vector<edge>g[5010],G[5010];
struct node{
	int ls,rs,ds;
	edge e;
	node(int l=0,int r=0,int d=0,edge E=edge()){
		ls=l,rs=r,ds=d,e=E;
	}
	friend bool operator <(const node A,const node B){return A.e.w<B.e.w;}
}T[300003]; 
int ctz;
int rt[5010];
inline void upd(int x){
	if(ds(ls(x))<ds(rs(x)))swap(ls(x),rs(x));
	ds(x)=ds(rs(x))+1;
}
inline int merge(int x,int y){
	if(!x||!y)return x|y;
	if(T[y]<T[x])swap(x,y);
	int p=++ctz;
	T[p]=T[x];
	rs(p)=merge(rs(x),y);
	upd(p);
	return p;
}
bool p[200300];
double d[5100];
int pre[5100];
vector<int>f[5100];
inline void add(int u,int v,double w){
	++cnt;
	E[cnt]={u,v,w};
	g[v].push_back({u,cnt,w});
}
inline int BD(vector<edge>Y){
	if(Y.empty())return 0;
	int p=++ctz;
	auto it=Y.begin();
	it++;
	bool tg=0;
	vector<edge>L,R;
	while(it!=Y.end()){
		if(tg)
		L.push_back(*it);
		else R.push_back(*it);
		it++;
		tg^=1;
	}
	
	T[p]=node(BD(L),BD(R),0,*Y.begin());
	upd(p);
	return p;	
}
inline void dfs(int u){
	for(int v:f[u])
		rt[v]=merge(rt[v],rt[u]),dfs(v);
}
inline void dij(){
	for(int i=1;i<=n;i++)
		d[i]=1e18;
	d[n]=0;
	priority_queue<pii,vector<pii>,greater<pii>>q;
	q.push({0,n});
	while(!q.empty()){
		int u=p2(q.top());
		double sw=p1(q.top());
		q.pop();
		if(d[u]!=sw)continue;
		for(auto e:g[u]){
			int v=e.v;
			double w=e.w;
			if(d[v]>sw+w){
				d[v]=sw+w;
				pre[v]=e.id;
				q.push({d[v],v});
			}
		} 
	}
}
inline void INIT(){
	cin>>n>>m>>K;
	for(int i=1;i<=m;i++){
		int u,v;
		double w=0;
		cin>>u>>v>>w;
		add(u,v,w);
	}
	dij();
	for(int i=1;i<n;i++)
		p[pre[i]]=1;
	for(int i=1;i<=cnt;i++)if(!p[i]){
		int u=E[i].u,v=E[i].v;
		double w=E[i].w;
		G[u].push_back({v,0,d[v]-d[u]+w});
	}
	for(int i=1;i<n;i++)
		rt[i]=BD(G[i]),f[E[pre[i]].v].push_back(i);
	dfs(n);
	
}
int ct[20030];
inline void calc(){
	priority_queue<pii,vector<pii>,greater<pii>>q;
	t(0)=1;
	q.push({d[1],0});
	int cnt=0;
	while(!q.empty()){
		double sw=p1(q.top());
		int x=p2(q.top());
		q.pop();
		if(sw>K)break;
		K-=sw;
//		cout<<K<<endl;
//		ct[(int)sw]++; 
		cnt++;
		if(t(x)!=n){
//			if(rt[t(x)]==0)cout<<t(x)<<endl;
			q.push({sw+w(rt[t(x)]),rt[t(x)]});
				
		}
		if(ls(x))
		q.push({sw-w(x)+w(ls(x)),ls(x)});
		if(rs(x))
		q.push({sw-w(x)+w(rs(x)),rs(x)});
	}
	cout<<cnt<<endl;
//	int P=0;
//	for(int i=1;ct[i];i+=2)
//	cout<<i<<" "<<ct[i]<<endl,P+=i*ct[i];
//	cout<<P<<endl;
}
signed main(){
    ios::sync_with_stdio(0);
//    freopen("P2483_3.in","r",stdin);
//    freopen("b.out","w",stdout);
	INIT();
	calc();
	cout.flush();
    return 0;
}
2024/1/7 21:53
加载中...