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

For the first test case, we have

	   0	   1	   2	   3	   4	   5	   6	   7	   8
X	   1	   2	 185180	 788997	1483212	4659423	4123738	2178800	 219267
Y	   3	   4	1633196	7845564	2071599	4562697	3523912	317737	1167849
Z	 90127	 180251	1620338	2064506	 625135	5664774	5647950	8282552	4912390

the cost matrix C is
	         	   0	 180251	1620338
	                2064506	   0	5664774	
	                5647950	8282552	   0	

So the minimal cost from city 0 to city 1 is 180251, while the distance to city 2 is 1620338. Given M = 10, city 1 and city 2 belong to category 1 and 8 respectively. Since only category 1 and 8 contain at least one city, the minimal one of them, category 1, is the desired answer to Doge’s question.

题意:找从起点0开始到n-1各点的最短距离!注意要先模m后再找最短距离,也就是说存在原路径并不是最短距离,但是模上m后就是最短的距离的情况!

dijkstra代码如下:

#include <cstdio>
#include <iostream>
#include <algorithm>
#define MAX 1017
#define INF 1000000000
using namespace std;
__int64 c[MAX][MAX];
__int64 x[MAX*MAX], y[MAX*MAX], z[MAX*MAX];

void dijkstra (__int64 mat[][MAX],int n, int s,int f)
{//s为起点, f:为终点
	__int64 dis[MAX];//记录到任何点的最短距离
	__int64 mark[MAX];//记录被选中的结点
	int i,j,k = 0;
	for(i = 0 ; i < n ; i++)//初始化所有结点,每个结点都没有被选中
		mark[i] = 0;
    for(i = 0 ; i < n ; i++)//将每个结点到start结点weight记录为当前distance
    {
        dis[i] = mat[s][i];
        //path[i] = s;
    }
    mark[s] = 1;//start结点被选中
    //path[s] = 0;
    dis[s] = 0;//将start结点的的距离设置为0
    __int64 min ;//设置最短的距离。
    for(i = 1 ; i < n; i++)
    {
        min = INF;
        for(j = 0 ; j < n;j++)
        {
            if(mark[j] == 0  && dis[j] < min)//未被选中的结点中,距离最短的被选中
            {
                min = dis[j] ;
                k = j;
            }
        }
        mark[k] = 1;//标记为被选中
        for(j = 0 ; j < n ; j++)
        {
            if( mark[j] == 0  && (dis[j] > (dis[k] + mat[k][j])))//修改剩余结点的最短距离
            {
                dis[j] = dis[k] + mat[k][j];
            }
        }
    }
}
int main()
{
    int n, m;
	int i, j;

	while(~scanf("%d%d",&n,&m))
	{
		scanf("%I64d%I64d%I64d%I64d",&x[0],&x[1],&y[0],&y[1]);
		for(i = 0; i < 2; i++)
		{
			z[i] = (x[i]*90123+y[i])%8475871+1;
		}
		for(i = 2; i <= n*n; i++)
		{
			x[i]=(12345+x[i-1]*23456+x[i-2]*34567+x[i-1]*x[i-2]*45678)%5837501;
			y[i]=(56789+y[i-1]*67890+y[i-2]*78901+y[i-1]*y[i-2]*89012)%9860381;
			z[i]=(x[i]*90123+y[i])%8475871+1;
		}
		for(i = 0; i < n; i++)
		{
			for(j = 0; j < n; j++)
			{
				if(i == j)
					c[i][j] = 0;
				else
					c[i][j] = z[i*n+j];
			}
		}
		__int64 mmax = INF, ans;
		dijkstra(c,n,0,n-1);
		for(i = 1; i < n; i++)
		{
			ans = dis[i];
			if(ans == 0)
				continue;
			ans%=m;
			if(mmax > ans)
			{
				mmax = ans;
			}
		}
		printf("%I64d\n",mmax);
	}
	return 0;
}

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

时间: 2024-10-12 14:52:58

hdu4849 Wow! Such City!(最短路dijkstra)的相关文章

HDU-4849 Wow! Such City! (单源最短路)

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 pa

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

http://acm.hdu.edu.cn/showproblem.php?pid=4849 会有很多奇怪的Wa的题,当初在西安就不知道为什么wa,昨晚做了,因为一些Sb错误也wa了很久,这会儿怎么写都会AC.... 收获: 1.还是基本都构思好在去敲代码,因为当时没过,昨晚心里有阴影,敲得很慢,而且最开始各种取模以防止漏掉,太保守了......以后一定先估算是不是需要取模防止TLE,当然时间够的话还是适当多取个模防止莫名其妙的错误.. 2.如果出错,注意参数是不是对的,最开始写好之后,因为m和

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

hdu1690 Bus System(最短路 Dijkstra)

Problem Description Because of the huge population of China, public transportation is very important. Bus is an important transportation method in traditional public transportation system. And it’s still playing an important role even now.The bus sys

POJ1062 Expensive dowry 【最短路dijkstra】

详细看:http://blog.csdn.net/lyy289065406/article/details/6645852 简单说一下:每个物品是一个结点,边的权值是,edge[u][v]的值表示用物品u换物品v的价格 一开始所有物品都置为原价,即所有dist[i]为原价,用dijkstra算法,算出0点(啥物品都没有)到各点的最短距离,求出dist[1]即为花费 枚举每个物品的等级为这条交易链的最高等级,把所有等级高于它的或者比它小超过等级限制的点都剔除,可以用bool数组剔除,然后用上述的d

POJ 2387 Til the Cows Come Home (最短路+Dijkstra)

Til the Cows Come Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 29550   Accepted: 9935 Description Bessie is out in the field and wants to get back to the barn to get as much sleep as possible before Farmer John wakes her for the

POJ-3268-最短路(dijkstra算法)

Silver Cow Party Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 12494   Accepted: 5568 Description One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to attend the big cow party to be held at farm #X (1 ≤ X