标签:
分层图最短路,令k=sqrt(n)#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#include<set>#include<cmath>#define ll long long#define inf 1e9#define eps 1e-10#define N 3500010#define mdusing namespace std;struct yts { int t,l,ne;} e[15000010];int dis[N],v[N],q[N],g[30010][110];bool vis[N];set<int> st[30010];int cnt,num,S,T;void put(int x,int y,int l){num++; e[num].t=y; e[num].l=l;e[num].ne=v[x]; v[x]=num;}int spfa(){for (int i=1;i<=cnt;i++) dis[i]=inf;int h=0,w=1; q[1]=S; dis[S]=0; vis[S]=1;while (h!=w){h++; if (h>cnt+2) h=1; int x=q[h];for (int i=v[x];i;i=e[i].ne){int y=e[i].t;if (dis[y]>dis[x]+e[i].l){dis[y]=dis[x]+e[i].l;if (!vis[y]){vis[y]=1;w++; if (w>cnt+2) w=1; q[w]=y;}}}vis[x]=0;}if (dis[T]==inf) return -1;return dis[T];}int main(){int n,m;scanf("%d%d",&n,&m);int K=min(100,(int)sqrt(n));for (int i=0;i<n;i++){for (int j=0;j<=K;j++)g[i][j]=++cnt;for (int j=1;j<=K;j++)put(g[i][j],g[i][0],0);}for (int i=1;i<=m;i++){int x,p;scanf("%d%d",&x,&p);if (i==1) S=g[x][0];if (i==2) T=g[x][0];if (p>K){for (int j=x-p;j>=0;j-=p) put(g[x][0],g[j][0],(x-j)/p);for (int j=x+p;j<n;j+=p) put(g[x][0],g[j][0],(j-x)/p);}else{put(g[x][0],g[x][p],0);if (st[p].find(x%p)==st[p].end()){st[p].insert(x%p);for (int j=x%p;j+p<n;j+=p){put(g[j][p],g[j+p][p],1);put(g[j+p][p],g[j][p],1);}}}}printf("%d\n",spfa());return 0;}
标签:
原文地址:http://blog.csdn.net/heheda_is_an_oier/article/details/51332860