A*70分的看过来

P1491 集合位置

@[雨季](/space/show?uid=36728) A*本来靠的就是多次经过同一个点的距离改变,打标的话不就求不出来了吗???
by Brandon鹏 @ 2018-11-05 12:29:24


```cpp #include<cstdio> #include<algorithm> #include<cstring> #include<queue> #include<cmath> #include<map> using namespace std; const double INF=1e9+7; queue<int >q; double dis[201]; int n,m; double x[201],y[201]; int book[201]; struct node { int id; double dis; double g; bool operator < (const node &bb)const { return dis+g>bb.dis+bb.g; } }; priority_queue<node>pq; struct EDGE { int s; int e; double w; int next; }edge[100001]; int head[201]; int cnt; void add(int s,int e,double w) { cnt++; edge[cnt].s=s; edge[cnt].e=e; edge[cnt].w=w; edge[cnt].next=head[s]; head[s]=cnt; cnt++; edge[cnt].s=e; edge[cnt].e=s; edge[cnt].w=w; edge[cnt].next=head[e]; head[e]=cnt; } void spfa(int s) { for(int i=1;i<=n;i++) { dis[i]=INF; } dis[s]=0; q.push(s); book[s]=1; while(!q.empty()) { int u=q.front(); q.pop(); book[u]=0; for(int t=head[u];t;t=edge[t].next) { int v=edge[t].e; if(dis[v]>dis[u]+edge[t].w) { dis[v]=dis[u]+edge[t].w; if(!book[v]) { book[v]=1; q.push(v); } } } } } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%lf%lf",&x[i],&y[i]); } for(int i=1;i<=m;i++) { int p1,p2; scanf("%d%d",&p1,&p2); add(p1,p2,sqrt((x[p2]-x[p1])*(x[p2]-x[p1])+(y[p1]-y[p2])*(y[p1]-y[p2]))); } spfa(n); node yes; yes.id=1; yes.dis=0; yes.g=dis[1]; pq.push(yes); int ti=0; while(!pq.empty()) { node now=pq.top(); pq.pop(); if(now.id==n) { ti++; } if(ti==2) { printf("%.2lf",now.dis); return 0; } int u=now.id; node tt; for(int t=head[u];t;t=edge[t].next) { int v=edge[t].e; tt.id=v; tt.g=dis[v]; tt.dis=now.dis+edge[t].w; pq.push(tt); } } return 0; } ```
by Brandon鹏 @ 2018-11-05 12:29:56


@[雨季](/space/show?uid=36728) 求教
by Brandon鹏 @ 2018-11-05 12:30:07


@[Brandon鹏](/space/show?uid=86154) 我也是这个问题,70分,但是如果加了它题解那个判重,连样例都过不去了.
by PPXppx @ 2019-09-18 20:20:38


|