distance(Floyd求最短路)

十二分熱愛發表於2018-08-04

1967年,美國著名的社會學家斯坦利·米爾格蘭姆提出了一個名為“小世界現象(small world phenomenon)”的著名假說,大意是說,任何2個素不相識的人中間最多隻隔著6個人,即只用6個人就可以將他們聯絡在一起,因此他的理論也被稱為“六度分離”理論(six degrees of separation)。雖然米爾格蘭姆的理論屢屢應驗,一直也有很多社會學家對其興趣濃厚,但是在30多年的時間裡,它從來就沒有得到過嚴謹的證明,只是一種帶有傳奇色彩的假說而已。 

Lele對這個理論相當有興趣,於是,他在HDU裡對N個人展開了調查。他已經得到了他們之間的相識關係,現在就請你幫他驗證一下“六度分離”是否成立吧。

Input

本題目包含多組測試,請處理到檔案結束。 
對於每組測試,第一行包含兩個整數N,M(0<N<100,0<M<200),分別代表HDU裡的人數(這些人分別編成0~N-1號),以及他們之間的關係。 
接下來有M行,每行兩個整數A,B(0<=A,B<N)表示HDU裡編號為A和編號B的人互相認識。 
除了這M組關係,其他任意兩人之間均不相識。 

Output

對於每組測試,如果資料符合“六度分離”理論就在一行裡輸出"Yes",否則輸出"No"。

Sample Input

8 7
0 1
1 2
2 3
3 4
4 5
5 6
6 7
8 8
0 1
1 2
2 3
3 4
4 5
5 6
6 7
7 0

Sample Output

Yes
Yes

 

#include <iostream>
#include<cstdio>
using namespace std;
const int MAX=0x3f3f3f;
int dis[102][102];
void Floyd(int n)
{
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			for(int k=0;k<n;k++)
			{
				if(dis[j][k]>dis[j][i]+dis[i][k])
				dis[j][k]=dis[j][i]+dis[i][k];
			}
		}
	}
}
int main(){
	int n,m,a,b;
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		int flag=0;
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<n;j++)
			{
				dis[i][j]=MAX;
			}
			dis[i][i]=0;
		}
		while(m--)
		{
			scanf("%d%d",&a,&b);
			dis[a][b]=dis[b][a]=1;
		}
		Floyd(n);
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<n;j++)
			{
				if(dis[i][j]>7)
				{
					flag=1;
					break;
				}
			}
		}
		if(flag==0)
	printf("Yes\n");
	else 
	printf("No\n");
	
	}
	return 0;
} 

 

相關文章