这道题很简单,最短路径的变形,只不过图的邻接矩阵(C【i】【j】)要自己先求出来,公式题目也给出来了。最短路径3种方法都能用,WA了几次全因为题目要求的结果没明白……读题真是硬伤啊。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAX 1234567
#define MODx 5837501
#define MODy 9860381
#define INF 0x3f3f3f3f
using namespace std;
__int64 N,M,x0,y0,x1,y1;
__int64 X[MAX],Y[MAX],Z[MAX],C[1009][1009],visit[1009],dis[1009],use[MAX];
void Dijkstra()
{
__int64 i,j,next,MIN;
memset(visit,0,sizeof(visit));
for(i=0; i<N; i++)
dis[i]=INF;
dis[0]=0;
for(i=0; i<N; i++)
{
MIN=INF;
for(j=0; j<N; j++)
if(!visit[j]&&dis[j]<=MIN)
MIN=dis[next=j];
if(MIN==INF)break;
visit[next]=1;
for(j=0; j<N; j++)
if(!visit[j]&&dis[j]>dis[next]+C[next][j])
dis[j]=dis[next]+C[next][j];
}
}
int main()
{
while(~scanf("%I64d %I64d %I64d %I64d %I64d %I64d",&N,&M,&X[0],&X[1],&Y[0],&Y[1]))
{
Z[0]=((X[0]*90123)%8475871+Y[0])%8475871+1;
Z[1]=((X[1]*90123)%8475871+Y[1])%8475871+1;
for(__int64 k=2; k<N*N+N; k++)
{
X[k]=(12345+(X[k-1]*23456)%MODx+(X[k-2]*34567)%MODx+((X[k-1]*X[k-2])%MODx*45678)%MODx)%MODx;
Y[k]=(56789+(Y[k-1]*67890)%MODy+(Y[k-2]*78901)%MODy+((Y[k-1]*Y[k-2])%MODy*89012)%MODy)%MODy;
Z[k]=((X[k]*90123)%8475871+Y[k])%8475871+1;
}
for(__int64 i=0; i<N; i++)
{
for(__int64 j=0; j<N; j++)
{
if(i==j)C[i][j]=0;
else C[i][j]=Z[i*N+j];
}
}
Dijkstra();
/*memset(use,0,sizeof(use));
for(__int64 i=1; i<N; i++)
{
use[dis[i]%M]++;
}
__int64 ans=0,cnt;
for(__int64 i=0; i<M; i++)
{
if(ans<use[i])
{
ans=use[i];
cnt=i;
}
}
printf("%I64d\n",cnt);*/
for(__int64 i=0; i<N; i++)
dis[i]%=M;
sort(dis+1,dis+N);
printf("%I64d\n",dis[1]);
}
return 0;
}