为什么错?
查看原帖
为什么错?
743734
lht1217楼主2023/1/30 10:49
#include<bits/stdc++.h>
using namespace std;
#define N 205
#define db double
int n,m,k;
db dis1[N],dis2[N];
int num1[N],num2[N]; 
const db eps=1e-9;
struct node{
	int v,nxt;
	db w;
}edge[N*N];
int head[N],cnt;
void add(int u,int v,db w){
	cnt++;
	edge[cnt].v=v;
	edge[cnt].w=w;
	edge[cnt].nxt=head[u];
	head[u]=cnt;
}
struct rode{
	int u;
	db dis;
	friend bool operator < (rode a, rode b){
		return a.dis>b.dis;
	}
}cur;
void dj(){
	priority_queue<rode>q;
	dis1[1]=eps;	num1[1]=1;
	cur.dis=eps;	cur.u=1;
	q.push(cur);
	while(!q.empty()){
		cur=q.top();
		q.pop();
		int u=cur.u,num;
		db d=cur.dis;
		if(d>dis2[u]) continue;
		if(fabs(d-dis1[u])<eps) num=num1[u];
		else num=num2[u];
		for(int i=head[u];i;i=edge[i].nxt){
			int v=edge[i].v;
			db dis=d+edge[i].w;
			if(fabs(dis-dis1[v])<eps) num1[v]+=num;
			if(fabs(dis-dis2[v])<eps) num2[v]+=num;
			if(dis+eps<dis1[v]){
				dis2[v]=dis1[v];	num2[v]=num1[v];
				dis1[v]=dis;		num1[v]=num;
				cur.u=v;			cur.dis=dis1[v];
				q.push(cur);
			}
			else if(dis1[v]+eps<dis&&dis+eps<dis2[v]){
				dis2[v]=dis;
				num2[v]=num;
				cur.u=v;
				cur.dis=dis2[v];
				q.push(cur);
			}
		}
	}
}
int x[N],y[N];
db len(int tx,int ty){
	return sqrt(tx*tx+ty*ty);
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) scanf("%d%d",&x[i],&y[i]);
	for(int i=1,u,v;i<=m;i++){
		scanf("%d%d",&u,&v);
		db w=len(x[u]-x[v],y[u]-y[v]);
		add(u,v,w);	add(v,u,w);
	}
	for(int i=1;i<=n;i++) dis1[i]=dis2[i]=1e12;
	dj();
	if(num2[n]==0){
		if(num1[n]<=1) printf("-1");
		else printf("%.2lf",dis1[n]);
	}
	else printf("%.2lf",dis2[n]);
	return 0;
}
2023/1/30 10:49
加载中...