标签:
分层图最短路,令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 md
using 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