一道简单的dijkstra 写了好久。。。了个大去 果然代码太弱了
#include<iostream>
#include<cstdlib>
#include<cstring>
#define INF 0x3f3f3f3f
#define MAXM 1009
using namespace std;
long long x[MAXM*MAXM],y[MAXM*MAXM],z[MAXM*MAXM];
long long s[MAXM],dist[MAXM];
long long map[MAXM][MAXM];
long long m,n;
int i,j,k;
void dijkstra(int v0){
for(i=0;i<n;i++){
dist[i]=map[v0][i];
s[i]=0;
}
s[v0]=1;dist[v0]=0;
for(i=0;i<n-1;i++){
long long min=INF;
long long u=v0;
for(j=0;j<n;j++){
if(!s[j]&&dist[j]<min){
u=j;min=dist[j];
}
}
s[u]=1;
for(k=0;k<n;k++){
if(!s[k] && map[u][k]<INF && dist[u]+map[u][k]<dist[k]){
dist[k]=dist[u]+map[u][k];
}
}
}
}
int main(){
while(cin>>n>>m){
cin>>x[0]>>x[1]>>y[0]>>y[1];
for(i=2;i<n*(n+1);i++){
x[i]=(12345+x[i-1]*23456+x[i-2]*34567+x[i-1]*x[i-2]*45678)%5837501;
y[i]=(56789+y[i-1]*67890+y[i-2]*78901+y[i-2]*y[i-1]*89012)%9860381;
z[i]=(x[i]*90123+y[i])%8475871+1;
}
z[0]=(x[0]*90123+y[0])%8475871+1;
z[1]=(x[1]*90123+y[1])%8475871+1;
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(i==j)
map[i][j]=0;
else
map[i][j]=z[i*n+j];
}
}
long long c;
long long mint=INF;
dijkstra(0);
for(i=1;i<n;i++){
c=dist[i]%m;
if(c<mint)
mint=c;
}
cout<<mint<<endl;
}
return 0;
}