2014西安邀请赛部分题解

这道题很简单,最短路径的变形,只不过图的邻接矩阵(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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值