zoukankan      html  css  js  c++  java
  • HDU 4849-Wow! Such City!(最短路)

    Wow! Such City!

    Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others)
    Total Submission(s): 824    Accepted Submission(s): 310


    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 country there are N (2 ≤N≤ 1000) cities labeled 0 . . . N - 1. He is currently in city 0. Meanwhile, for each pair of cities, there exists a road connecting them, costing Ci,j (a positive integer) for traveling from city i to city j. Please note that Ci,j may not equal to Cj,i for any given i ≠ j.
    Doge is carefully examining the cities: in fact he will divide cities (his current city 0 is NOT included) into M (2 ≤ M ≤ 106) categories as follow: If the minimal cost from his current city (labeled 0) to the city i is Di, city i belongs to category numbered Di mod M.Doge wants to know the “minimal” category (a category with minimal number) which contains at least one city.
    For example, for a country with 4 cities (labeled 0 . . . 3, note that city 0 is not considered), Doge wants to divide them into 3 categories. Suppose category 0 contains no city, category 1 contains city 2 and 3, while category 2 contains city 1, Doge consider category 1 as the minimal one.
    Could you please help Doge solve this problem?



    Note:

    Ci,j is generated in the following way:
    Given integers X0, X1, Y0, Y1, (1 ≤ X0, X1, Y0, Y1≤ 1234567), for k ≥ 2 we have
    Xk  = (12345 + Xk-1 * 23456 + Xk-2 * 34567 + Xk-1 * Xk-2 * 45678)  mod  5837501
    Yk  = (56789 + Yk-1 * 67890 + Yk-2 * 78901 + Yk-1 * Yk-2 * 89012)  mod  9860381
    The for k ≥ 0 we have

    Zk = (Xk * 90123 + Yk ) mod 8475871 + 1

    Finally for 0 ≤ i, j ≤ N - 1 we have

    Ci,j = Zi*n+j for i ≠ j
    Ci,j = 0   for i = j

     

    Input
    There are several test cases. Please process till EOF.
    For each test case, there is only one line containing 6 integers N,M,X0,X1,Y0,Y1.See the description for more details.
     

    Output
    For each test case, output a single line containing a single integer: the number of minimal category.
     

    Sample Input
    3 10 1 2 3 4 4 20 2 3 4 5
     

    Sample Output
    1 10
    头一次遇到区域赛的最短路的题目。。

    尽管不是纯最短路(只是也差点儿相同了。。)权值由递推公式(题目中已给出)生成,然后跑一遍dijkstra,起点为1,求dis[i]%m的最小值。权值注意超出int范围要用lld

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <algorithm>
    #define inf 0x3f3f3f3f
    #define ll long long
    using namespace std;
    ll dis[1010],v[1010];
    ll map[1010][1010];
    int x0,x1,y0,y1,n,m;
    void dijkstra()
    {
        int minx,k=0;
        for(int i=0; i<=n; i++)
        {
            dis[i]=map[0][i];;
            v[i]=0;
        }
        dis[0]=0;
        for(int j=0; j<n; j++)
        {
            minx=inf;
            for(int i=0; i<n; i++)
            {
                if(v[i]==0&&minx>dis[i])
                {
                    minx=dis[i];
                    k=i;
                }
            }
            v[k]=1;
            for(int i=0; i<n; i++)
            {
                if(v[i]==0&&dis[i]>dis[k]+map[k][i])
                {
                    dis[i]=dis[k]+map[k][i];
                }
            }
        }
        return ;
    }
    ll xx[1002000],yy[1002000],zz[1002000];
    int main()
    {
        while(scanf("%d%d%d%d%d%d",&n,&m,&x0,&x1,&y0,&y1)!=EOF)
        {
            for(int i=0; i<n; i++)
            {
                for(int j=0; j<n; j++)
                {
                    map[i][j]=inf;
                }
                map[i][i]=0;
            }
            xx[0]=x0;xx[1]=x1;
            yy[0]=y0;yy[1]=y1;
            for(int i=2; i<=n*(n-1)+n; i++)
            {
                xx[i]=(12345+xx[i-1]*23456+xx[i-2]*34567+xx[i-1]*xx[i-2]*45678)%5837501;
                yy[i]=(56789+yy[i-1]*67890+yy[i-2]*78901+yy[i-1]*yy[i-2]*89012)%9860381;
            }
            for(int i=0; i<=n*(n-1)+n; i++)
            {
                zz[i]=(xx[i]*90123+yy[i])%8475871+1;
            }
            for(int i=0; i<n; i++)
            {
                for(int j=0; j<n; j++)
                {
                    if(i==j)
                        map[i][j]=0;
                    else map[i][j]=zz[i*n+j];
                }
            }
            dijkstra();
            ll minn=inf;
            for(int i=1; i<n; i++)
            {
                minn=min(minn,dis[i]%m);
            }
            printf("%lld
    ",minn);
        }
        return 0;
    }
    



  • 相关阅读:
    ClickOnce發布經驗
    reporting Server組件不全引起的致命錯誤
    異步調用
    Usercontrol Hosted in IE
    MATLAB命令大全(转载)
    一种保护眼睛的好方法
    关于oracle自动编号
    An Algorithm Summary of Programming Collective Intelligence (1)
    An Algorithm Summary of Programming Collective Intelligence (3)
    An Algorithm Summary of Programming Collective Intelligence (4)
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5351581.html
Copyright © 2011-2022 走看看