0
点赞
收藏
分享

微信扫一扫

Geodetic集合(c++)

村里搬砖的月野兔 2022-04-13 阅读 70
c++

【问题描述】

 

    图G是一个无向连通图,没有自环,并且两点之间至多只有一条边。我们定义顶点v,u最短路径就是从v到u经过边最少的路径。所有包含在v-u的最短路径上的顶点被称为v-u的Geodetic顶点,这些顶点的集合记作I(v, u)。

我们称集合I(v, u)为一个Geodetic集合。

例如下图中,I(2, 5)={2, 3, 4, 5},I(1, 5)={1, 3, 5},I(2, 4)={2, 4}。

1

3

2

5

4

正在上传…重新上传取消

给定一个图G和若干点对v,u,请你分别求出I(v, u)。

【输入格式】(geo.in)

    第一行两个整数n,m,分别表示图G的顶点数和边数(顶点编号1-n)

    下接m行,每行两个整数a,b表示顶点a和b之间有一条无向边。

    第m+2行有一个整数k,表示给定的点对数。

    下接k行,每行两个整数v,u。

【输出格式】(geo.out)

共k行,每行对应输入文件中每一个点对v,u,按顶点编号升序输出I(v, u)。同一行的每个数之间用空格分隔。

【样例】

geo.in

geo.out

5 6

1 2

1 3

2 3

2 4

3 5

4 5

3

2 5

5 1

2 4

2 3 4 5

1 3 5

2 4

数据范围

    100%的数据,n<=40

#include<bits/stdc++.h> 
using namespace std;
int a[105][105],n,m,q,x,y;
int main()
{
	//freopen("geo.in","r",stdin);
	//freopen("geo.out","w",stdout); 
	cin>>n>>m;
	memset(a,0x3f3f3f,sizeof(a));
	for(int i=1;i<=m;i++)
	{
		cin>>x>>y;
		a[x][y]=a[y][x]=1;
		a[x][x]=a[y][y]=0;
	}
	for(int k=1;k<=n;k++)
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				a[i][j]=min(a[i][j],a[i][k]+a[k][j]);
	cin>>q;
	for(int t=1;t<=q;t++)
	{
		cin>>x>>y;
		for(int i=1;i<=n;i++)
			if(a[x][i]+a[i][y]==a[x][y])
				cout<<i<<' ';
		cout<<endl;
	}
	return 0;
}
举报

相关推荐

0 条评论