萌新14分求教

P3393 逃离僵尸岛

@[KevinYu](/space/show?uid=105496) 同
by 蒟蒻wyx @ 2018-11-09 20:27:48


@[蒟蒻wyx](/space/show?uid=34511) 已解决; 1.开long long 2.dij跑错了
by KevinYu @ 2018-11-09 21:03:36


@[KevinYu](/space/show?uid=105496) 怎么跑错了?
by 蒟蒻wyx @ 2018-11-09 21:13:17


@[蒟蒻wyx](/space/show?uid=34511) 我把我第二次代码发给你吧。 我不好解释 ```cpp #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<ctime> #include<climits> #include<algorithm> #include<complex> #include<map> #include<queue> #include<vector> #define ll long long #define INF 0x3f3f3f3f using namespace std; struct edge { ll to,next,weight; }a[2000020],p[2000020]; struct node { ll dist,id; node(){} node(ll dist,ll id):dist(dist),id(id){} }; bool operator <(node xi,node yi) { return xi.dist>yi.dist; } ll n,m,k,s; ll cnp(0),cnt(0); ll head[1000010]; ll dist[1000010]; ll vis[1000010]; ll headp[1000010]; ll dng[1000010]; ll pre[1000010]; pair<ll,ll>ed[1000010]; ll x,y,w; ll csp,csq; void addedge(ll xi,ll yi,ll wi) { a[cnt].to=yi; a[cnt].next=head[xi]; a[cnt].weight=wi; head[xi]=cnt++; } void preadd(ll xi,ll yi,ll wi) { p[cnp].to=yi; p[cnp].next=headp[xi]; p[cnp].weight=wi; headp[xi]=cnp++; } void dijkstra(ll s0) { memset(pre,-1,sizeof(pre)); memset(vis,0,sizeof(vis)); memset(dist,INF,sizeof(dist)); priority_queue<node> q; q.push(node(0,s0)); dist[s0]=0; while(!q.empty()) { node t(q.top()); q.pop(); if(vis[t.id])continue; vis[t.id]=1; for(ll i=head[t.id];i!=-1;i=a[i].next) { ll v=a[i].to; if(dist[v]>a[i].weight+t.dist) { pre[v]=t.id; dist[v]=a[i].weight+t.dist; q.push(node(dist[v],v)); } } } } void predij(ll s0) { memset(vis,0,sizeof(vis)); memset(dist,INF,sizeof(dist)); priority_queue<node> q; q.push(node(0,s0)); dist[s0]=0; while(!q.empty()) { node t(q.top()); q.pop(); if(vis[t.id])continue; vis[t.id]=1; for(ll i=headp[t.id];i!=-1;i=p[i].next) { ll v=p[i].to; if(dist[v]>p[i].weight+t.dist) { dist[v]=p[i].weight+t.dist; q.push(node(dist[v],v)); } } } } int main() { memset(head,-1,sizeof(head)); memset(headp,-1,sizeof(headp)); scanf("%lld%lld%lld%lld",&n,&m,&k,&s); scanf("%lld%lld",&csp,&csq); for(ll i=1;i<=k;i++) { scanf("%lld",&x); preadd(n+1,x,0); } for(ll i=1;i<=m;i++) { scanf("%lld%lld",&x,&y); ed[i].first=x; ed[i].second=y; preadd(x,y,1); preadd(y,x,1); } predij(n+1); for(ll i=1;i<=n;i++) { if(i==1||i==n)dng[i]=0; else if(dist[i]==0)dng[i]=INF; else if(dist[i]<=s)dng[i]=csq; else dng[i]=csp; } for(ll i=1;i<=m;i++) { addedge(ed[i].first,ed[i].second,dng[ed[i].first]+dng[ed[i].second]); addedge(ed[i].second,ed[i].first,dng[ed[i].first]+dng[ed[i].second]); } dijkstra(1); printf("%lld\n",dist[n]/2); return 0; } ```
by KevinYu @ 2018-11-10 05:33:54


|