Geodetic集合
P3906
技术统计
难度
提高+/省选-
用时
30min
提交次数 1
unaccept 次数 0
ac次数 1
题意概括
题干不能再概括了啊啊啊啊
数据范围
n ≤ 40 n\le40 n≤40
解法、
知识点
- floyd
- 最短路
解法概括
我欺负它数据范围小,就直接跑floyd咯。然后枚举1~n所有的点,若存在dis[i][k]+dis[k][j]==dis[i][j],则ans++。个人认为这里是floyd算法的逆应用。
坑点
- 一定要建双向边
- 每次统计完后别忘记sort一下,以防万一
代码实现
#include<cstdio>
#include<algorithm>
#include<cstring>
#define inf 40
using namespace std;
int n,m;
int vis[50];
int f[50][50];
inline int read()
{
int f=1,k=0;
char c=getchar();
while(c>'9'||c<'0')
{
if(c=='-')f=-1;
c=getchar();
}
while(c>='0'&&c<='9')k=(k<<1)+(k<<3)+(c^48),c=getchar();
return f*k;
}
void floyd()
{
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
}
int main()
{
n=read();m=read();
memset(f,inf,sizeof(f));
for(int i=1;i<=m;i++)
{
int a=read(),b=read();
f[a][b]=f[b][a]=1;
}
floyd();
int q=read();
for(int i=1;i<=q;i++)
{
memset(vis,0,sizeof(vis));
int a=read(),b=read(),cnt=0;
vis[++cnt]=a;
for(int j=1;j<=n;j++)
if(f[a][j]+f[j][b]==f[a][b])vis[++cnt]=j;
vis[++cnt]=b;
sort(vis+1,vis+cnt+1);
for(int j=1;j<cnt;j++)printf("%d ",vis[j]);
printf("%d\n",vis[cnt]);
}
}
类似题目
还没做到qwq(本来这里我想打ye的,但是没找到,,结果发现了“吔”,,,果然b站不能完全相信QAQ)