hdu 4849 Wow! Such City!

这道题比较简单,表示自己坑了自己,一直把那个Ci,j 当成是Di,也不知道自己怎么读题的,真的是脑残了。然后直接对那个C[0][I] 做%m了,果断地WA了10多次。

正解思路:首先根据给定的公式把Xk Yk, Zk求出来,然后求出C矩阵。再对C矩阵进行一次单源最短路径,0为起点。最后对dist数组进行%m,再排一次序,就能求出最小值了。注意数据范围,用__int64。


代码:

<span style="font-size:14px;">#include <stdio.h>
#include <string.h>
#include <iostream>
#include <stdlib.h>
#include <algorithm>
using namespace std;
const int maxn = 1000005;
int n,m;
__int64 arr[maxn],brr[maxn],c[1024][1024],z[maxn],dist[maxn],vis[1024];
void dijsktra(int s)
{
    for(int i=0;i<=n;i++)
    {
        vis[i]=0;
        dist[i]=c[s][i];
    }
    vis[s]=1;
    dist[s]=0;
    for(int i=1;i<n;i++)
    {
        int p=0,min=99999999;
        for(int j=0;j<n;j++)
        {
            if(!vis[j]&&dist[j]<min)
            {
                min=dist[j];
                p=j;
            }
        }
        vis[p]=1;
        for(int j=0;j<n;j++)
            if(!vis[j]&&dist[p]+c[p][j]<dist[j])
            dist[j]=dist[p]+c[p][j];
    }
}
int main(){
    //freopen("in.txt","r",stdin);
    while( scanf("%d%d%I64d%I64d%I64d%I64d",&n,&m,&arr[0],&arr[1],&brr[0],&brr[1])!=EOF ){
        memset( c,0,sizeof(c) );
        memset( z,0,sizeof(z) );
        memset(dist,0,sizeof(dist));
        for( int i=2;i<n*n;i++ ){
           arr[i] = (12345 + arr[i-1] * 23456 + arr[i-2] * 34567 + arr[i-1] * arr[i-2] * 45678) %  5837501;
           brr[i] = (56789 + brr[i-1] * 67890 + brr[i-2] * 78901 + brr[i-1] * brr[i-2] * 89012)  % 9860381;
        }
        for( int i=0;i<n*n;i++ ){
           z[i] = (arr[i] * 90123 + brr[i]) % 8475871 + 1;
        }
        for( int i=0;i<n;i++ ){
            for( int j=0;j<n;j++ ){
                if( i==j )
                    c[i][j] = 0;
                else
                    c[i][j] = z[i*n+j];
            }
        }
       dijsktra(0);
       for(int i=0;i<n;i++)
        dist[i]%=m;
       sort(dist+1,dist+n);
        printf("%I64d\n",dist[1]);
        memset( arr,0,sizeof(arr) );
        memset( brr,0,sizeof(brr) );
    }
    return 0;
}
</span>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值