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;
    }
    



  • 相关阅读:
    1105 Spiral Matrix (25分)(蛇形填数)
    1104 Sum of Number Segments (20分)(long double)
    1026 Table Tennis (30分)(模拟)
    1091 Acute Stroke (30分)(bfs,连通块个数统计)
    1095 Cars on Campus (30分)(排序)
    1098 Insertion or Heap Sort (25分)(堆排序和插入排序)
    堆以及堆排序详解
    1089 Insert or Merge (25分)
    1088 Rational Arithmetic (20分)(模拟)
    1086 Tree Traversals Again (25分)(树的重构与遍历)
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5351581.html
Copyright © 2011-2022 走看看