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)
上一篇 2022年2月1日 上午11:00
下一篇 2022年2月1日 上午11:00


相关推荐

  • sleep 和 wait 区别

    sleep 和 wait 区别sleep 和 wait 区别 区别一 所属对象不一样区别一 对锁的控制权

    2026年3月18日
    2
  • 数据结构二叉树中序遍历_数据结构二叉树先序

    数据结构二叉树中序遍历_数据结构二叉树先序二叉树中序遍历二叉树中序遍历的实现思想是:访问当前节点的左子树 访问根节点 访问当前节点的右子树图1二叉树以上图1为例,中序遍历的过程如下:访问该二叉树的根节点,找到1 遍历节点1的左子树,找到节点2 遍历节点2的左子树,找到节点4 由于节点4无左孩子,因此找到节点4,并遍历节点4的右子树 由于节点4无右子树,因此节点2的左子树遍历完成,访问节点2 遍历节点2的右子树,找到节点5 由于节点5无左子树,因此访问节点5

    2025年11月15日
    5
  • python如何打开bson文件

    python如何打开bson文件importbsonbs file open test bson rb bson data bson loads bson file read

    2026年3月26日
    3
  • ViewStub使用[通俗易懂]

    ViewStub使用[通俗易懂]一、ViewStub是什么?<ViewStub>标签实质上是一个宽高都为0的不可见的轻量级View。通过延迟按需加载布局的方式提升页面加载速度。二、ViewStub使用场景某布局默认是不可见,当满足特定场景才显示。比如网络异常提示、引导页等。三、ViewStub怎么使用?1、创建布局文件layout_test.xml(注:根标签可以是布局或控件,但不能为<merge>,子标签可以使用<merge>)<TextView…

    2022年6月28日
    32
  • unity打包webgl程序和js键盘监听事件冲突的问题。

    unity打包webgl程序和js键盘监听事件冲突的问题。

    2021年6月17日
    141
  • 软件项目管理知识点总结

    软件项目管理知识点总结软件项目管理第1章软件项目管理概述1、项目的基本概念(注意与日常运作的区分)和特征;2、软件项目及特征;3、项目管理的基本概念;4、项目管理知识体系(以2017年发布的PMBOK6的十个知识领域为准);5、适用于软件项目管理的知识体系。​第2章项目确立&第3章生存期模型【项目初始】1、理解项目启动的基本过程(项目评估、项目立项、招投标、发布项目章程);2、项目章程的主要内容和作用;3、理解各生存期模型的优缺点及适用场景。第4章软件项目需求管理1、软件需求的概念及层次;2、需求工程的组成。需

    2022年5月9日
    43

发表回复

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

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