洛谷 U84985 Seaway找路
题目背景
SeawaySeaway和他的女朋友即将在JDFZJDFZ开启他们的高中生活...但是不幸的是,万恶的分班考试没有让Seaway*Seawa**y*和女朋友分到一个班级(qwq)。浓烈的相思让他们决定在每天中午都去找对方......
题目描述
JDFZJDFZ的校园是一个含有NN个点、MM条边的带权无向图。SeawaySeaway和女朋友一共要相会PP天(1 \le P \le 50001≤P≤5000),并且,每一天他们俩的位置都不确定(很奇妙吧)。每天中午,他们两个当然希望走最少的路就能和对方相见。但SeawaySeaway很快又遇到了难题:他不认路......(连SeawaySeaway都不认路,他的女朋友更不可能认路了),两个路痴怎么能顺利地相会呢?SeawaySeaway灵机一动,想到了一个办法:他要编写程序把每一天他们要走的路径输出出来,这样他和他的女朋友就可以顺顺利利地找到对方啦!但是SeawaySeaway不屑做这么简单的工作(其实是他不会),所以他把这个任务交给了你。
输入格式
第一行包括两个整数:NN,MM。
接下来MM行,每行三个整数X,Y,ZX,Y,Z,表示X,YX,Y之间有一条长为ZZ的边。
接下来是一个整数PP,表示Seaway*Seawa**y和女朋友一共要相会PP*天。
接下来的PP行,每行两个整数A,BA,B,表示这一天他们的位置为A,BA,B。
输出格式
输出有PP行,每行包含若干个整数,表示A,BA,B之间最短路的路径(输出包含A,BA,B并按升序输出)。如果A,BA,B之间不存在最短路,输出qwq。
输入输出样例
输入 #1复制
输出 #1复制
说明/提示
提示:
不排除Seaway*Seawa**y*一开始就和女朋友在一起的情形。
数据范围:
1 \le N \le 1001≤N≤100,1 \le M \le 100001≤M≤10000。
题解:
\(Seaway\)的基础图论专场T2...
其实是用floyd枚举断点,最后输出ans数组(能保证升序)
如果tot(计数器)得0的话,输出qwq就可以了。
细节上的问题蛮多的,出数据的时候也是费了我很大心思。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,p,tot,ans[110];
int map[110][110];
int main()
{
//freopen("#10.in","r",stdin);
//freopen("#10.out","w",stdout);
scanf("%d%d",&n,&m);
memset(map,0x3f,sizeof(map));
for(int i=1;i<=n;i++)
map[i][i]=0;
for(int i=1;i<=m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
map[x][y]=map[y][x]=z;
}
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
map[i][j]=min(map[i][k]+map[k][j],map[i][j]);
scanf("%d",&p);
while(p--)
{
tot=0;
memset(ans,0,sizeof(ans));
int a,b;
scanf("%d%d",&a,&b);
for(int k=1;k<=n;k++)
if(map[a][k]+map[k][b]==map[a][b] || map[b][k]+map[k][a]==map[a][b])
ans[++tot]=k;
if(tot==0)
{
printf("qwq\n");
continue;
}
for(int i=1;i<=tot;i++)
printf("%d ",ans[i]);
printf("\n");
}
return 0;
}