80分求大佬指教

P1491 集合位置

```cpp #include<iostream> #include<iomanip> #include<cmath> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #include<queue> using namespace std; int n,m; struct uct1{ int x; int y; }p[205]; struct uct2{ int to; int next; double v; }l[100005]; int read(){ int ans=0,fh; char c; c=getchar(); if(c=='-')fh=-1; while('0'<=c&c<='9'){ ans*=10; ans+=c-'0'; c=getchar(); } return ans*fh; } int cnt,h[205]; int square(int x){ return x*x; } void add(int f,int t){ double len=sqrt(square(double(p[f].x-p[t].x))+square(double(p[f].y-p[t].y))); cnt++; l[cnt].to=t; l[cnt].next=h[f]; l[cnt].v=len; h[f]=cnt; cnt++; l[cnt].to=f; l[cnt].next=h[t]; l[cnt].v=len; h[t]=cnt; } double vis[205],d2[205],d1[205]; queue<int>q; void spfa(int x,double d[]){ q.push(x); vis[205]=1; for(int i=1;i<=n;i++){ d[i]=0xfffffff; } d[x]=0; double len; int top,to; while(!q.empty()){ top=q.front(); q.pop(); vis[top]=0; for(int i=h[top];i!=0;i=l[i].next){ to=l[i].to;len=l[i].v; if(d[to]>d[top]+len){ d[to]=d[top]+len; if(vis[to]==0){ q.push(to); vis[to]=1; } } } } } int a,b; int main(){ cin>>n>>m; // n=read(); // m=read(); for(int i=1;i<=n;i++){ // p[i].x=read(); // p[i].y=read(); cin>>p[i].x>>p[i].y; } for(int i=1;i<=m;i++){ // a=read(); // b=read(); cin>>a>>b; add(a,b); } spfa(1,d1); spfa(n,d2); double minn=0xfffffff,ll=d1[n]; for(int i=1;i<=n;i++){ if(d1[i]+d2[i]<minn&&d1[i]+d2[i]>ll){ minn=d1[i]+d2[i]; } } // for(int i=1;i<=n;i++){ // cout<<d1[i]<<" "; // } // cout<<endl; // for(int i=1;i<=n;i++){ // cout<<d2[i]<<" "; // } // cout<<endl; // cout<<minn<<endl; // for(int i=1;i<=n;i++){ // cout<<l[i].v<<" "; // } // cout<<endl; if(minn==0xfffffff)cout<<-1; else cout<<fixed<<setprecision(2)<<minn; return 0; } ``` 同上
by p9t6g @ 2018-07-10 14:25:11


|