请大佬指教

P4568 [JLOI2011] 飞行路线

```cpp #include<iostream> #include<cstdio> #include<cstring> #include<queue> #define E 1000010 #define inf 1e11 #define ll long long using namespace std; int n,m,k; int s,t,u,v; ll w; struct node{ int to; int next; ll value; }edge[E]; int head[E]; ll dis[E]; bool vis[E]; int cnt; void add_edge(int u,int v,ll w) { cnt++; edge[cnt].to=v; edge[cnt].next=head[u]; head[u]=cnt; edge[cnt].value=w; } void dijkstra(int x) { priority_queue<pair<ll,int> > q; for(int i=0;i<=(k+1)*n+2;i++) { dis[i]=inf; vis[i]=false; } dis[x]=0; q.push(make_pair(0,x)); while(!q.empty()) { int temp=q.top().second; q.pop(); if(vis[temp])continue; vis[temp]=true; for(int i=head[temp];i;i=edge[i].next) { if(dis[temp]+edge[i].value<dis[edge[i].to]) { dis[edge[i].to]=dis[temp]+edge[i].value; q.push(make_pair(-dis[edge[i].to],edge[i].to)); } } } } int main() { scanf("%d%d%d%d%d",&n,&m,&k,&s,&t); s++,t++; for(int i=1;i<=m;i++) { scanf("%d%d%lld",&u,&v,&w); u++,v++; for(int j=0;j<=k;j++) { add_edge(u+j*n,v+j*n,w); add_edge(v+j*n,u+j*n,w); } if(k)for(int j=0;j<=k-1;j++) { add_edge(u+j*n,v+(j+1)*n,0); add_edge(v+j*n,u+(j+1)*n,0); } } add_edge((k+1)*n+1,s,0); for(int i=0;i<=k;i++)add_edge(t+i*n,(k+1)*n+2,0); dijkstra((k+1)*n+1); printf("%lld\n",dis[(k+1)*n+2]); return 0; } ```
by Zed_ @ 2019-04-01 00:20:34


orz!!!
by A_Big_Jiong @ 2019-04-01 00:29:43


@[Zed_](/space/show?uid=73092) ~~怎么什么题都能评上紫~~你这是加边加炸了...题目的$m<=50000,k<=10$,双向边开双倍,再乘上$k$是$1e6$,但是你的代码里有一段不明所以的 ```cpp add_edge((k+1)*n+1,s,0); for(int i=0;i<=k;i++)add_edge(t+i*n,(k+1)*n+2,0); ``` 所以很明显空间起码比$1e6$多开$k*2$的大小...不懂你的思路...
by ZPC2048 @ 2019-04-01 01:16:57


@[Zed_](/space/show?uid=73092) 链式前向星开到1e7A了
by Smile_Cindy @ 2019-04-01 10:03:33


好的,明白了,谢谢
by Zed_ @ 2019-04-01 12:10:32


|