hdoj1869 六度分離(flody)

六度分離

Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Problem Description
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
 

Author
linle

題目地址:點擊打開鏈接

思路:  1 題意中可以理解到,任意倆人可以通過最多6個人相識,加上題中直接給的關係(初始化爲1),
         則關係距離一定要小於等於7
  2 可以採用floyd()的方法,時間複雜度爲(O3),不建議用來解大數據的題。

AC代碼:
#include<cstdio>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define oo 100000000
int n, m, a, b;	
int i, j, k;
int pri[205][205];
void floyd()
{
	for(k = 0; k < n; k++)
	    for(i = 0; i < n; i++)
	        for(j = 0; j < n; j++)
	            pri[i][j]=min(pri[i][j],pri[i][k]+pri[k][j]);
}
int main()
{
	while(scanf("%d%d", &n, &m) != EOF)
    {
    
    	for(i = 0; i < n; i++)//n個人的編號是從0到n-1 
    	    for(j = 0; j < n; j++)
    	        pri[i][j] = i == j ? 0 : oo;   
    	for(i = 0; i < m; i++)
    	{
    		scanf("%d %d", &a, &b);
    		pri[a][b] = pri[b][a] = 1;
    		//直接給出的人與人之間認識的距離爲一 ,此處若是0勢必影響後續指令 
		}		
		floyd();//好好的函數可不要忘記調用
		int cnt = 0;//記錄兩兩間關係數目
		for(i = 0; i < n-1; i++)
		    for(j = i+1; j < n; j++)
		    {
		    	if(pri[i][j] <=7)
		    	//兩兩間有關係 且 中間人不超過6個 
		    	    cnt++;
		    //	printf("%d\n", pri[i][j]);
			}
		if(cnt == n*(n-1)/2)    printf("Yes\n");
		else    printf("No\n");
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章