1. 程式人生 > >bzoj 1579: [Usaco2009 Feb]Revamping Trails 道路升級【分層圖+spfa】

bzoj 1579: [Usaco2009 Feb]Revamping Trails 道路升級【分層圖+spfa】

lin empty 一次 想法 更新 str end 一個 最短

至死不用dijskstra系列2333,洛谷上T了一個點,開了O2才過
基本想法是建立分層圖,就是建k+1層原圖,然後相鄰兩層之間把原圖的邊在上一層的起點與下一層的終點連起來,邊權為0,表示免了這條邊的邊權,然後答案就是第0層的s到k層的t的最短路,因為0權邊總是從上一層連到下一層,所以到達k層就表示走了k條0權邊
這樣的點數是nk的,不管是dijskstra還是spfa都跑不過
然後仔細觀察這張圖的特性,發現不同層之間的更新只有上一層通過0權邊更新下一層,所以考慮單層更新,每一層都做一次spfa,然後跨層的時候用上一層跑過的最短路和0權邊更新下一層
然後給spfa加一個SLF優化即可

#include<iostream>
#include<cstdio> #include<queue> #include<cstring> #include<ctime> using namespace std; const int N=50005,inf=1e9; int n,m,k,h[N],cnt,dis[N],d[N]; bool v[N]; deque<int>q; struct qwe { int ne,no,to,va; }e[N<<2]; int read() { int r=0,f=1; char p=getchar(); while
(p>‘9‘||p<‘0‘) { if(p==‘-‘) f=-1; p=getchar(); } while(p>=‘0‘&&p<=‘9‘) { r=r*10+p-48; p=getchar(); } return r*f; } inline void add(int u,int v,int w) { cnt++; e[cnt].ne=h[u]; e[cnt].no=u; e[cnt].to=v; e[cnt].va=w; h[u]=cnt; } void
spfa() { while(!q.empty()) { int u=q.front(); q.pop_front(); v[u]=0; for(int i=h[u];i;i=e[i].ne) if(dis[e[i].to]>dis[u]+e[i].va) { dis[e[i].to]=dis[u]+e[i].va; if(!v[e[i].to]) { v[e[i].to]=1; if(!q.empty()&&dis[q.front()]>dis[e[i].to]) q.push_front(e[i].to); else q.push_back(e[i].to); } } } } int main() { 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); // for(int j=0;j<=k;j++) // add(x+j*n,y+j*n,z),add(y+j*n,x+j*n,z); // for(int j=1;j<=k;j++) // add(x+(j-1)*n,y+j*n,0),add(y+(j-1)*n,x+j*n,0); } for(int i=1;i<=n;i++) dis[i]=inf; // clock_t st,ed; // st=clock(); v[1]=1,dis[1]=0,q.push_back(1); spfa(); for(int con=1;con<=k;con++) { for(int i=1;i<=n;i++) d[i]=inf; v[1]=1,dis[1]=0,q.push_back(1); for(int i=1;i<=cnt;i++) if(d[e[i].to]>dis[e[i].no]) { d[e[i].to]=dis[e[i].no]; if(!v[e[i].to]) { v[e[i].to]=1; if(!q.empty()&&d[q.front()]>d[e[i].to]) q.push_front(e[i].to); else q.push_back(e[i].to); } } for(int i=1;i<=n;i++) dis[i]=d[i]; spfa(); } // ed=clock(); // cerr<<st<<" "<<ed<<" "<<ed-st<<endl; printf("%d\n",dis[n]); return 0; }

bzoj 1579: [Usaco2009 Feb]Revamping Trails 道路升級【分層圖+spfa】