spfa板子题
#include<iostream> #include<queue> #include<cmath> #include<cstdio> using namespace std; const double inf=9999999; int n,m,s,t;//s是起点,t是终点 double dis[1005]; int top=0; struct pp { int to,next; double w;//权值 }a[50005]; int head[1005],book[1005]; double diss(int x1,int y1,int x2,int y2) { return sqrt((double)(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); } void add(int from,int to,double w)//链式前向星建图 { a[++top].next=head[from]; a[top].w=w; a[top].to=to;//to到达的是顶点序号 head[from]=top;//相当于一个链 } void spfa() { for(int i=1;i<=105;i++)dis[i]=inf; queue<int>q; q.push(s); dis[s]=0; while(q.size()) { int x=q.front(); q.pop();book[x]=0; for(int i=head[x];i;i=a[i].next)//这里是边的序号 { int v=a[i].to;//v是到达的顶点的编号 if(dis[v]>dis[x]+a[i].w) { dis[v]=dis[x]+a[i].w; if(book[v]==0) { q.push(v); book[v]=1; } } } } } void solve() { cin>>n; int i; int x[105],y[105]; for(i=1;i<=n;i++)cin>>x[i]>>y[i]; cin>>m; for(i=1;i<=m;i++) { int aa,bb; cin>>aa>>bb; double cc=diss(x[aa],y[aa],x[bb],y[bb]); add(aa,bb,cc); add(bb,aa,cc); } cin>>s>>t; spfa(); printf("%.2lf",dis[t]); } int main() { solve(); }