hdu 4849 最短路 西安邀请赛 Wow! Such City!

http://acm.hdu.edu.cn/showproblem.php?pid=4849

会有很多奇怪的Wa的题,当初在西安就不知道为什么wa,昨晚做了,因为一些Sb错误也wa了很久,这会儿怎么写都会AC。。。。

收获:

1、还是基本都构思好在去敲代码,因为当时没过,昨晚心里有阴影,敲得很慢,而且最开始各种取模以防止漏掉,太保守了......以后一定先估算是不是需要取模防止TLE,当然时间够的话还是适当多取个模防止莫名其妙的错误、、

2、如果出错,注意参数是不是对的,最开始写好之后,因为m和n写混,样例卡了,,最后换了另一个版本的最短路,还是因为一个变量写混了,WA了很久

3、以后比赛期间如果时间还有而且不知为什么没过,考虑自己重新写吧,给别人看代码排错还是不太容易搞出来的,

4、数据大的时候 开数组果断都long long吧

5、最重要的----如果RE ,先看数组有没有开错--我最开始因为键盘按键错位,,少敲了个0,一直RE,其次,也是非常重要的,初始化,不要太懒直接memset,我

up=MAXN*MAXN,然后TLE了很久,,,以及时间跑的很长,,,

843MS AC

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>

using namespace std;
#define ll long long
#define INF 0x03F3F3F3F
const int N = 1234567+10;
const int MAXN=1000+30;
const int MOD1=5837501;
const int MOD2=9860381;
const int MOD3=8475871;
ll x[N],y[N],z[N];
ll c[1010][1010];
ll lowcost[MAXN];
int vis[MAXN];
int n,m;

void calC()
{
    int up=n*n;
    for(int k=0;k<2;k++)
        z[k]=( x[k]*90123  + y[k] ) % MOD3 +1;
    for(int k=2;k<up;k++)
    {
        x[k]=(  12345+ x[k-1]* 23456  +x[k-2]*34567 + (x[k-2]*45678)%MOD1 *x[k-1] %MOD1 )%MOD1;
        y[k]=(  56789+ y[k-1]* 67890  +y[k-2]*78901 + (y[k-2]*89012)%MOD2 *y[k-1] %MOD2 )%MOD2;
         z[k]=( x[k]*90123  + y[k] ) % MOD3 +1;
    }
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
        {
            if(i == j){c[i][j]=0;continue;}
            c[i][j]=z[i*n+j];
        }
}
void Dij()
{
    memset(vis,0,sizeof(vis));
    for(int i=0;i<=n;i++)
        lowcost[i]=INF;
    vis[0]=1;
    for(int i=0;i<n;i++)
        lowcost[i]=c[0][i];
    lowcost[0]=0;
    int pre=0,mmin=INF;
    for(int i=1;i<n;i++)
    {
        mmin=INF;
        for(int j=0;j<n;j++)
            if(vis[j] == 0 && lowcost[pre]+c[pre][j]<lowcost[j])
            {
                lowcost[j]=lowcost[pre]+c[pre][j];
            }
        for(int j=0;j<n;j++)
        {
            if(vis[j] == 0 && lowcost[j]<mmin)
            {
                mmin=lowcost[j];
                pre=j;
            }
        }
        vis[pre]=1;
    }
}
int solve()
{
    int mmin=INF,tmp;
    for(int i=1;i<n;i++)
    {
        tmp=lowcost[i]%m;
        if( tmp< mmin  )
            mmin=tmp;
    }
    return mmin;
}
int main()
{
    //freopen("hdu4849.txt","r",stdin);
    while(scanf("%d%d%I64d%I64d%I64d%I64d",&n,&m,&x[0],&x[1],&y[0],&y[1])!=EOF)
    {
        calC();
        Dij();
        printf("%d\n",solve());

    }
    return 0;
}

再贴另一个版本1515MS AC

-----可见人家吉大的模板还是效率很高的,吉大的只花了一半时间,,,

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>

using namespace std;
#define ll __int64
const ll INF = 0x03F3F3F3F;
//const ll INF = 0x3f3f3f3f3f3f3f3f;
const int N = 1010*1010+1000;
const int MAXN=1000+30;
const int MOD1=5837501;
const int MOD2=9860381;
const int MOD3=8475871;
ll x[N],y[N],z[N];
ll c[1010][1010];
ll lowcost[MAXN];
int vis[MAXN];
int n,m;

void calC()
{
   // x[0]%=5837501,x[1]%=5837501;
  //  y[0]%=9860381,y[1]%=9860381;
    int up=(n)*(n);/////////
    for(int k=0;k<2;k++)
        z[k]=(( x[k]*90123 ) %MOD3 + y[k] ) % MOD3 +1;
    for(int k=2;k<up;k++)
    {
        x[k]=( ( 12345+ (x[k-1]* 23456 )%MOD1 )%MOD1 +( (x[k-2]*34567)%MOD1 + ((x[k-2]*45678)%MOD1 )*x[k-1] %MOD1 )%MOD1)%MOD1;
        y[k]=(( 56789+ (y[k-1]* 67890 )%MOD2 )%MOD2 +((y[k-2]*78901)%MOD2 +((y[k-2]*89012)%MOD2 )*y[k-1] %MOD2 )%MOD2)%MOD2;
        z[k]=(( x[k]*90123 ) %MOD3 + y[k] ) % MOD3 +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];
        }
}
void Dij()
{
    for(int i=0;i<=n;i++)
        lowcost[i]=INF;
    for(int i=0;i<n;i++)
    {
        lowcost[i]=c[0][i];
        vis[i]=0;
    }
    lowcost[0]=0;vis[0]=1;
    int u=0;
    for(int i=0;i<n-1;i++)
    //while(1)
    {
        int mmin=INF;
        for(int j=0;j<n;j++)
            if(!vis[j] && lowcost[j]<mmin)
        {
            u=j;
            mmin=lowcost[j];
        }
       // if(mmin == INF)break;
        vis[u]=1;
        for(int k=0;k<n;k++)
        {
            if(!vis[k] && lowcost[u]+c[u][k]<lowcost[k])
                lowcost[k]=lowcost[u]+c[u][k];

        }
    }
}

int solve()
{
    int mmin=INF,tmp;
    for(int i=1;i<n;i++)
    {
        tmp=lowcost[i]%m;
        if( tmp< mmin )
            mmin=tmp;
    }
        //mmin=min(mmin,lowcost[i]%m);
    return mmin;
}
int main()
{
    //freopen("hdu4849.txt","r",stdin);
    while(scanf("%d%d%I64d%I64d%I64d%I64d",&n,&m,&x[0],&x[1],&y[0],&y[1])==6)
    {
        calC();
        Dij();
        printf("%d\n",solve());

    }
    return 0;
}

hdu 4849 最短路 西安邀请赛 Wow! Such City!,布布扣,bubuko.com

时间: 2024-12-07 03:16:36

hdu 4849 最短路 西安邀请赛 Wow! Such City!的相关文章

HDU 4849 Wow! Such City!陕西邀请赛C(最短路)

HDU 4849 Wow! Such City! 题目链接 题意:按照题目中的公式构造出临接矩阵后,求出1到2 - n最短路%M的最小值 思路:就根据题目中方法构造矩阵,然后写一个dijkstra,利用d数组取求答案即可 代码: #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const long long I

hdu 4849 Wow! Such City! (最短路spfa)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4849 Wow! Such City! Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others) Total Submission(s): 1486    Accepted Submission(s): 511 Problem Description Doge, tired of bei

hdu 4849 Wow! Such City!(dijstra)

题目链接:hdu 4849 Wow! Such City! 题目大意:有N个城市,给定计算两两城市距离的公式,然后求0到1~N-1的城市中,最短路径模掉M的最小值. 解题思路:先根据公式求出距离C矩阵,注意中间连乘3次的可能爆long long,然后用裸的dijstra算法求最短路. #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using name

西安邀请赛C题 单源点最短路

作者 : Dolphin 原文地址:http://blog.csdn.net/qingdujun/article/details/27109035 一.实体完整性定义 [例1]将Student表中的Sno属性定义为码. CREATE TABLE Student ( Sno CHAR(10) PRIMARY KEY, /*在列定义主码*/ Sname CHAR(20) NOT NULL, Sage SMALLINT ); 或者: CREATE TABLE Student ( Sno CHAR(10

hdu4849 Wow! Such City!(最短路dijkstra)

转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4849 Problem Description Doge, tired of being a popular image on internet, is considering moving to another city for a new way of life. In his co

【随笔】天道酬勤——西安邀请赛之感

至今我都不敢相信周日那天发生了什么.当我那个只是抱着试一试的心态去提交的D题结果竟然返回AC的时候,当志愿者把第四个气球送过来的时候,当我们的排名一度达到12名的时候,我不敢相信自己的双眼.直到最后,我看到了那张平平淡淡的获奖证书,看到了上面写着的NWPU_Assassin.我才真正的冷静下来,原来上帝还是眷顾我的. 一 其实这次比赛我们又当志愿者又当参赛队员,累得半死.志愿者们系统不会搞,我们来:座位安排不会,我们来:前前后后大事小事都是我们在搞.热身赛的时候我们一个队做完两个题之后就直接去当

hdu 4849

简单题,公式计算+最短路.注意点:注意1 取模,2 数组开到n*n+n. #include<iostream> #include<queue> using namespace std; long long x[1234567];long long y[1234567];long long z[1234567]; int c[1001][1001]; int d[1002];int inq[1002]; const int inf=0x3f3f3f3f; int n,m; void

【题解整理】西安邀请赛部分题题解

很抱歉,学校的OJ并不支持外网,而且还没有加上题目... A 字符串基本处理 http://blog.csdn.net/polossk/article/details/27113175 B 状态压缩加剪枝,但是我们没敢做 C 单源点最短路 http://blog.csdn.net/polossk/article/details/27113385 D 字符串生成器 深搜 http://blog.csdn.net/polossk/article/details/27120395 J 状态压缩DP h

ACM: HDU 2544 最短路-Dijkstra算法

HDU 2544最短路 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据.每组数据第一行是两个整数N.M(N<=100,M<