hdu 3631 Shortest Path(Floyd)[通俗易懂]

hdu 3631 Shortest Path(Floyd)

大家好,又见面了,我是全栈君。

题目链接:Shortest Path

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3962    Accepted Submission(s): 938

Problem Description
When YY was a boy and LMY was a girl, they trained for NOI (National Olympiad in Informatics) in GD team. One day, GD team’s coach, Prof. GUO asked them to solve the following shortest-path problem.

There is a weighted directed multigraph G. And there are following two operations for the weighted directed multigraph:

(1) Mark a vertex in the graph.

(2) Find the shortest-path between two vertices only through marked vertices.

For it was the first time that LMY faced such a problem, she was very nervous. At this moment, YY decided to help LMY to analyze the shortest-path problem. With the help of YY, LMY solved the problem at once, admiring YY very much. Since then, when LMY meets problems, she always calls YY to analyze the problems for her. Of course, YY is very glad to help LMY. Finally, it is known to us all, YY and LMY become programming lovers.

Could you also solve the shortest-path problem?

 
Input
The input consists of multiple test cases. For each test case, the first line contains three integers N, M and Q, where N is the number of vertices in the given graph, N≤300; M is the number of arcs, M≤100000; and Q is the number of operations, Q ≤100000. All vertices are number as 0, 1, 2, … , N – 1, respectively. Initially all vertices are unmarked. Each of the next M lines describes an arc by three integers (x, y, c): initial vertex (x), terminal vertex (y), and the weight of the arc (c). (c > 0) Then each of the next Q lines describes an operation, where operation “0 x” represents that vertex x is marked, and operation “1 x y” finds the length of shortest-path between x and y only through marked vertices. There is a blank line between two consecutive test cases.

End of input is indicated by a line containing N = M = Q = 0.

 
Output
Start each test case with “Case #:” on a single line, where # is the case number starting from 1.

For operation “0 x”, if vertex x has been marked, output “ERROR! At point x”.

For operation “1 x y”, if vertex x or vertex y isn’t marked, output “ERROR! At path x to y”; if y isn’t reachable from x through marked vertices, output “No such path”; otherwise output the length of the shortest-path. The format is showed as sample output.

There is a blank line between two consecutive test cases.

 
Sample Input
   
   
5 10 10 1 2 6335 0 4 5725 3 3 6963 4 0 8146 1 2 9962 1 0 1943 2 1 2392 4 2 154 2 2 7422 1 3 9896 0 1 0 3 0 2 0 4 0 4 0 1 1 3 3 1 1 1 0 3 0 4 0 0 0

 
Sample Output
   
   
Case 1: ERROR! At point 4 ERROR! At point 1 0 0 ERROR! At point 3 ERROR! At point 4

 
Source


代码例如以下:

#include <cstdio>
#include <cstring>
#define INF 0x3fffffff  
#define MAXN 317
int dis[MAXN][MAXN];
int mark[MAXN];
int n;
int min(int a, int b)
{
	return a < b ? a:b;
}
void init()
{
	for(int i = 0; i < n; i++)
	{
		for(int j = 0; j < n; j++)
		{
			if(i == j)
				dis[i][j] = 0;
			else
				dis[i][j] = INF;
		}
	}
}

void Floyd(int k)
{
	for(int i = 0; i < n; i++)
	{
		for(int j = 0; j < n; j++)
		{
			dis[i][j] = min(dis[i][j],dis[i][k]+dis[k][j]);
		}
	}
}

int main()
{
	int i, j;
	int M, Q;
	int a, b, w;
	int cas = 0;
	while(~scanf("%d%d%d",&n,&M,&Q))
	{
		if(n == 0 && M == 0 && Q == 0)
			break;
		if(cas != 0)
			printf("\n");
		init();
		memset(mark,0,sizeof(mark));
		for(i =  0; i < M; i++)
		{
			scanf("%d%d%d",&a,&b,&w);
			if(w < dis[a][b])
			{
				dis[a][b] = w;
			}
		}
		int op, x, y;
		printf("Case %d:\n",++cas);
		for(i = 0; i < Q; i++)
		{
			scanf("%d",&op);
			if(op == 0)
			{
				scanf("%d",&x);
				if(mark[x])
				{
					printf("ERROR! At point %d\n",x);
					continue;
				}
				mark[x] = 1;
				Floyd(x);
			}
			else if(op == 1)
			{
				scanf("%d%d",&x,&y);
				if(!mark[x] || !mark[y])
				{
					printf("ERROR! At path %d to %d\n",x,y);
					continue;
				}
				if(dis[x][y] >= INF)
					printf("No such path\n");
				else
					printf("%d\n",dis[x][y]);
			}
		}
	}
	return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115664.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Mybatis RowBounds 分页原理「建议收藏」

    Mybatis RowBounds 分页原理「建议收藏」在mybatis中,使用RowBounds进行分页,非常方便,不需要在sql语句中写limit,即可完成分页功能。但是由于它是在sql查询出所有结果的基础上截取数据的,所以在数据量大的sql中并不适用,它更适合在返回数据结果较少的查询中使用最核心的是在mapper接口层,传参时传入RowBounds(intoffset,intlimit)对象,即可完成分页注意:由于java允许的最大整数为2147483647,所以limit能使用的最大整数也是214748…

    2025年12月9日
    4
  • C#中DllImport用法和路径问题「建议收藏」

    转载:https://blog.csdn.net/zhoucaifu/article/details/5416892DllImport是System.Runtime.InteropServices命名空间下的一个属性类,其功能是提供从非托管DLL导出的函数的必要调用信息。DllImport属性应用于方法,要求最少要提供包含入口点的dll的名称。DllImport的定义如下:[Attribu…

    2022年4月8日
    275
  • 公网远程开机(唤醒家庭PC)

    公网远程开机(唤醒家庭PC)一、背景前一段搞使用seafile搞了私有云盘,不过不需要的时候开着电脑好像有点浪费,所以就开始了通过公网开机的道路二、关键性问题问题要说在前面,常规性的东西百度一般配置都可以搞定,如果各种面向百度的配置都已经尝试,请注意如下问题。. 一定在被开机的直连路由设备上进行MAC与IP地址绑定(原理略)。局域网直接子网内广播发送可以不用绑定。 被开机的系统需要安装对应的网卡驱动(实验CentOS7是有问题的,windows用驱动精灵安装下网卡驱动搞定)三、通过互联网公网远程开机一般性步骤按照常

    2022年5月30日
    66
  • 简单介绍一下spring bean的生命周期_Spring bean的生命周期

    简单介绍一下spring bean的生命周期_Spring bean的生命周期一、简介   SpringBean的生命周期在整个Spring中占有很重要的位置,从BeanFactory或ApplicationContext取得的实例为Singleton,也就是预设为每一个Bean的别名只能维持一个实例,而不是每次都产生一个新的对象使用Singleton模式产生单一实例,在spring中,singleton属性默认是true,只有设定为false,则每次指定别名取…

    2022年9月19日
    2
  • 互联网公司忽悠员工的黑话,套路太深了。。。

    据说这些是互联网公司招工时忽悠的黑话,大家来看看是不是真的? 再列举几个黑话: 老板: 产品: 程序员: 据说这些是互联网公司招工时忽悠的黑话,大家来看看是不是真的? 再列举几个黑…

    2021年6月24日
    92
  • HTML和CSS面试题及答案总结一

    HTML和CSS面试题及答案总结一对于html的语义化标签的理解,结构化标签的理解,同时写出简洁的html结构,如何进行SEO优化?答:对于html的语义化标签,用正确的标签做正确的事情。html语义化,让页面的内容结构化,便于对浏览器和搜索引擎的解析,在没有css样式的情况下,以文档的形式同样易于阅读,符合文档语义的标签。标签本身所代表的语义,每一个标签所带有的语义,根据语义去使用标签,依赖标记确定权重,同时也可以提高SE…

    2022年5月10日
    47

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号