HDU 4849 2014西安邀请赛 C题 Wow! Such City! 最短路
题意 :给你3个公式 给出x0,x1,y0,y1 算出矩阵 c在求出种类编号最小的数
种类编号= Di%m; Di为0点到i点最短的距离;
思路:给你3个公式
因为( i*n+j )差不多是n*(n-1)
所以 X Y Z 都先算到n*(n-1)个
然后得到邻接矩阵
dijkstra得到最短路 d [ n ]
全部 %m 输出最小值
#include<stdio.h> #include <stdlib.h> #include <limits.h> #include<string.h> #define LL __int64 #define M 1000*1000+1111 LL cost[1022][1033]; LL x[M],y[M],d[M],z[M]; LL n,m; bool used[M]; void dijkstra(LL s,LL V) // 邻接矩阵表示 { int i; for(i=0; i<=V; i++) { //初始化 d[i]=INT_MAX; used[i]=false; } d[s]=0; while(true) { int u; int v=-1; // 在未使用过的顶点中选择一个距离最小的顶点 for( u=0; u<V; u++) { if(!used[u]&&(v==-1 || d[u]<d[v])) v=u; } if(v==-1) break; //顶点全部使用过 used[v]=true; for( u=0; u<V; u++) { // 更新从v点能到达的点的最短路 d[u]=min(d[u],d[v]+cost[v][u]); } } } void init(){ memset(used,false ,sizeof(used)); memset(cost,0 ,sizeof(cost)); } int main() { while(scanf("%I64d",&n)!=EOF){ init(); int i,j; scanf("%I64d%I64d%I64d%I64d%I64d",&m,&x[0],&x[1],&y[0],&y[1]); z[0]=((x[0]*90123+y[0])%8475871+1); for(i=2; i<=n*n+n; i++){//得到X Y Z; x[i]= (12345 +( x[i-1]* 23456)% 5837501 + (x[i-2]* 34567)% 5837501 +( x[i-1] * x[i-2] * 45678)% 5837501) % 5837501; y[i]= (56789 + (y[i-1]* 67890)% 9860381+ (y[i-2]* 78901)% 9860381 + (y[i-1] * y[i-2] * 89012)% 9860381) % 9860381; z[i-1]=((x[i-1]*90123)%8475871+y[i-1])%8475871+1; } for(i=0; i<n; i++){ for(j=0; j<n; j++){ if(i==j) cost[i][j]=0; else cost[i][j]=z[i*n+j];//得到矩阵 } } dijkstra(0,n);//最短路 LL ans[1033]; for(i=1; i<n; i++) ans[i]=d[i]%m; LL minnn=INT_MAX; for(i=1;i<n;i++) minnn=min(minnn,ans[i]); printf("%I64d\n",minnn); } return 0; }