大家都太强了,可怕。代码写累了休息一下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?
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?
End of input is indicated by a line containing N = M = Q = 0.
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.
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
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;
}