1.29寒假集训-1

大家都太强了,可怕。代码写累了休息一下OTZ

今天有六题,A题water,B还没看,C Floyd,D dijkstra,E并查集,F还没看,目测好像还是并查集。

https://vjudge.net/contest/210011#overview

先贴一下C↓

C - Shortest Path

  https://vjudge.net/contest/210011#problem/C

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? 
InputThe 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. 
OutputStart 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

题意:多组测试数据,给N,M,Q,N个城市(编号从0开始到N-1),M条边,Q个操作。如果是0操作,如果x已经被标记,输出ERROR! At point x,如果没有被标记,标记x,因为之后1操作要求的最短路只能通过被标记的店,所以让x作为中转点Floyd一下;如果是1操作,如果x,y任意一个没有被标记,输出ERROR! At path x to y,二者间有路就输出最短路,没有就输出No such path。

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxv = 333;
const int inf = 99999999;

int mp[maxv][maxv],d[maxv];//邻接矩阵,最短路
int N,M,Q,co=1;
bool book[maxv]={false};//标记是否访问

void floyd(int k)//floyd大法好
{
	for(int i=0;i<N;i++)
	{
		for(int j=0;j<N;j++)
		{
			if(mp[i][j]>mp[i][k]+mp[k][j])
			{
				mp[i][j]=mp[i][k]+mp[k][j];
			}
		}
	}
}

int main()
{
	while(scanf("%d%d%d",&N,&M,&Q),N,M,Q)
	{
		fill(book,book+maxv,false);
		int x,y,c,temp;
		for(int i=0;i<N;i++)//初始化
		{
			for(int j=0;j<N;j++)
			{
				if(i!=j)
					mp[i][j]=inf;
				else
					mp[i][j]=0;
			}
		}
		for(int i=0;i<M;i++)
		{
			scanf("%d%d%d",&x,&y,&c);
			if(c<mp[x][y])//坑
			{
				mp[x][y]=c;
			}	
		}
		if(co!=1)
		{
			puts("");
		}
		printf("Case %d:\n",co++);
		for(int i=0;i<Q;i++)
		{
			scanf("%d",&temp);
			if(temp==1)
			{
				scanf("%d%d",&x,&y);
				if(book[x]==true&&book[y]==true)
				{
					if(mp[x][y]==inf)
						printf("No such path\n");
					else
						printf("%d\n",mp[x][y]);
				}
				else
				{
					printf("ERROR! At path %d to %d\n",x,y);
				}
			}
			else
			{
				scanf("%d",&x);
				if(book[x]==true)
				{
					printf("ERROR! At point %d\n",x);
				}
				else
				{
					book[x]=true;
					floyd(x);//算法入口
				}
			}
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_39396954/article/details/79195690