dijkstra 求助
查看原帖
dijkstra 求助
515990
Editzed楼主2022/8/25 11:34
#include<bits/stdc++.h>
using namespace std;

typedef pair<int,int>PII;
const int N=1010,M = 10010;
int n,m,s,f;
int head[N],nextt[M*2],to[M*2];
double len[M*2];
int cnt;
double dis[N][2],x[N],y[N];
double num[N][2];
int vis[N][2];

#define pow2(x) (x)*(x)
#define disof(i,j) sqrt(pow2(x[i]-x[j])+pow2(y[i]-y[j]))

void add(int u,int v,double w){
	to[cnt]=v,len[cnt]=w,nextt[cnt]=head[u],head[u]=cnt;
	cnt++;
}
struct node{
	int to;
	double dis;
	int kind;
	bool operator <(const node& a)const{
		return a.dis<dis;
	}
};

void dijstra(){
	for(int i = 1;i<=n;++i) dis[n][0] = dis[n][1] = 1e9;
	dis[s][0]=0,num[s][0]=1;
	priority_queue<node>q;
	q.push({s,dis[s][0],0});
	while(q.size()){
		int u=q.top().to;int kind=q.top().kind;q.pop();
		if(vis[u][kind])continue;
		vis[u][kind]=1;
		for(int i=head[u];i;i=nextt[i]){
			int v=to[i];
			if(dis[v][0]>dis[u][kind]+len[i]){
				dis[v][1]=dis[v][0];num[v][1]=num[v][0];
				q.push({v,dis[v][1],1});
				dis[v][0]=dis[u][kind]+len[i];
				num[v][0]=num[u][kind];
				q.push({v,dis[v][0],0});
			}
			else if(dis[v][0]==dis[u][kind]+len[i]){
				num[v][0]+=num[u][kind];
			}
			else if(dis[v][1]>dis[u][kind]+len[i]){
				dis[v][1]=dis[u][kind]+len[i];
				num[v][1]=num[u][kind];
				q.push({v,dis[v][1],1});
			}
			else if(dis[v][1]==dis[u][kind]+len[i]){
				num[v][1]+=num[u][kind];
			}
		}
	}
}

int main(){
		cin>>n>>m;
		for(int i = 1;i<=n;++i) cin>>x[i]>>y[i];
		cnt=1;
		for(int i=1;i<=m;i++){
			int u,v;
			cin>>u>>v;
			if(u==v)continue;
			add(u,v,disof(u,v));
			add(v,u,disof(u,v));
		}
		s=1,f=n;
		dijstra();
		cout<<dis[f][1];
		//(dis[f][1]==dis[f][0]+1?num[f][1]+num[f][0]:num[f][0])<<endl;
}
2022/8/25 11:34
加载中...