为什么A*MLE两个点啊!!!!
查看原帖
为什么A*MLE两个点啊!!!!
486001
Knighthood楼主2022/6/19 15:19
#include<bits/stdc++.h>
#define N 5001
#define M 200001
using namespace std;
int n,m,cnt[2],h[2][N],to[2][M],nex[2][M],V[N],ans;
double Merge,w[2][M],dis[N];
struct D{
	int k;double d;
	D(){}
	D(int a,double b){
		k=a,d=b;
	}
	bool operator < (const D &a) const{
		return d>a.d;
	}
};
struct Node{
	int v;
	double g,f;
	Node(){}
	Node(double a,double b,int c){
		g=a,f=b,v=c;
	}
	bool operator < (const Node &a) const{
		return f>a.f;
	}
};
inline void Edge(int a,int b,double c,int x){
	to[x][++cnt[x]]=b;
	nex[x][cnt[x]]=h[x][a];
	h[x][a]=cnt[x];
	w[x][cnt[x]]=c;
}
inline void Dij(int st){
	priority_queue<D> q;
	for(int i=0;i<=n;++i)dis[i]=INT_MAX*1.0;
	dis[st]=0.0;
	q.push(D(st,0.0));
	while(!q.empty()){
		D now=q.top();q.pop();
		if(V[now.k])continue;
		V[now.k]=1;
		for(int i=h[1][now.k];i;i=nex[1][i]){
			int v=to[1][i];
			if(V[v])continue;
			if(dis[v]>dis[now.k]+w[1][i]){
				dis[v]=dis[now.k]+w[1][i];
				q.push(D(v,dis[v]));
			}
		}
	}
}
inline void Tree(int S,int T){
	priority_queue<Node> E;
	int tot=0;
	if(dis[S]==dis[0])return;
	E.push(Node(0,dis[S],S));
	while(!E.empty()){
		Node now=E.top();E.pop();
		if(now.g>Merge)break;
		if(now.v==T){
			++ans,Merge-=now.g;continue;
		}
		for(int i=h[0][now.v];i;i=nex[0][i]){
			int v=to[0][i];
			E.push(Node(now.g+w[0][i],now.g+w[0][i]+dis[v],v));
		}
	}
}
int main(){
// 	freopen("P2483_1.in","r",stdin);
	ios::sync_with_stdio(false);
	cin.tie(NULL);cout.tie(NULL);
	cin>>n>>m>>Merge;
	for(int i=1;i<=m;++i){
		int a,b;double c;
		cin>>a>>b>>c;
		Edge(b,a,c,1);
		Edge(a,b,c,0);
	}
	Dij(n);
	Tree(1,n);
	cout<<ans;
	return 0;
}
2022/6/19 15:19
加载中...