JLOI2011 飛行路線
阿新 • • 發佈:2018-08-01
int 最短路 eof opera 堆優化 傳送門 main size ring
傳送門
分層圖\(SPFA\)……聽起來好高級的樣子……嗯,所以我選分層圖\(\rm{dijkstra}\)
這題好像是會卡\(SPFA\),要加一個玄學\(SLF\)優化才可以……
所以還是用堆優化\(\rm{dijkstra}\)吧,多好
以上全是瞎扯,但卡\(SPFA\)是真的
用\(\tt{dis[i][j]}\)表示免費乘坐了\(i\)次到達點\(j\)的最小代價,跑最短路的時候順推下來就可以了
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; int read(){ int k=0; char c=getchar(); for(;c<'0'||c>'9';) c=getchar(); for(;c>='0'&&c<='9';c=getchar()) k=(k<<3)+(k<<1)+c-48; return k; } struct zzz{ int t,len,nex; }e[50010<<1]; int head[10010],tot; void add(int x,int y,int z){ e[++tot].t=y; e[tot].len=z; e[tot].nex=head[x]; head[x]=tot; } int dis[21][10010]; struct hhh{ int v,cnt,pos; bool operator < (const hhh &y) const{ return v > y.v; } }; priority_queue <hhh> q; void dijkstra(int s,int num){ memset(dis,127,sizeof(dis)); dis[0][s]=0; q.push(hhh{0,0,s}); while(!q.empty()){ hhh k=q.top(); q.pop(); if(dis[k.cnt][k.pos]!=k.v) continue; for(int i=head[k.pos];i;i=e[i].nex){ int to=e[i].t; if(dis[k.cnt][to]>dis[k.cnt][k.pos]+e[i].len){ dis[k.cnt][to]=dis[k.cnt][k.pos]+e[i].len; q.push(hhh{dis[k.cnt][to],k.cnt,to}); } if(k.cnt+1<=num&&dis[k.cnt][k.pos]<dis[k.cnt+1][to]){ dis[k.cnt+1][to]=dis[k.cnt][k.pos]; q.push(hhh{dis[k.cnt+1][to],k.cnt+1,to}); } } } } int main(){ int n=read(),m=read(),k=read(); for(int i=1;i<=m;i++){ int x=read(),y=read(),z=read(); add(x,y,z), add(y,x,z); } dijkstra(1,k); cout<<dis[k][n]; return 0; }
JLOI2011 飛行路線