1. 程式人生 > >六度分離(弗洛伊德演算法)

六度分離(弗洛伊德演算法)

六度分離

Time Limit : 5000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 29   Accepted Submission(s) : 10
Problem Description1967年,美國著名的社會學家斯坦利·米爾格蘭姆提出了一個名為“小世界現象(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 Input8 70 11 22 33 44 55 66 78 80 11 22 33 44 55 66 77 0
Sample OutputYesYes

使用最短路徑(弗洛伊德演算法)

#include<stdio.h>
#define INF 0x3f3f3f
int main()
{
int m,n,i,j,a,b;
int map[100][100];//圖
while(scanf("%d%d",&m,&n)!=EOF)
{
int flag=0;
for(i=0;i<m;i++)//圖的初始化
{
for(j=0;j<m;j++)
{
if(i==j)
{
map[i][j]=0;
}
else
{
map[i][j]=INF;
}
}
}
for(i=0;i<n;i++)//將兩個有關係的人的關係設為1
{
scanf("%d%d",&a,&b);
map[a][b]=map[b][a]=1;
}
for(int i=0;i<m;i++)//弗洛伊德演算法
for(int j=0;j<m;j++)
for(int k=0;k<m;k++)
{
if(j!=k&&map[j][i]!=INF&&map[i][k]!=INF)
{
if(map[j][k]>map[j][i]+map[i][k])
{
map[j][k]=map[j][i]+map[i][k];
}
}
}
for(i=0;i<m;i++)// for(j=0;j<m;j++) { if(map[i][j]-1>6||map[i][j]==INF) { flag=1; } } if(flag==1) { printf("No\n"); } else { printf("Yes\n"); } } return 0; }

相關推薦

分離演算法

六度分離Time Limit : 5000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)Total Submission(s) : 29   Accepted Submission(s) : 10

最短路徑鄰接矩陣演算法

#include<bits/stdc++.h> #define MaxInt 1e8 #define MVNum 100 #define OK 1 #define ERROR 0 using namespace std; typedef int VerTexType; typedef i

Warshall演算法

    簡介:Floyd演算法又稱為插點法,是一種利用動態規劃的思想尋找給定的加權圖中多源點之間最短路徑的演算法,與Dijkstra演算法類似。該演算法名稱以創始人之一、1978年圖靈獎獲得者、斯坦福大學計算機科學系教授羅伯特·弗洛伊德命名。eg:暑假,小哼準備去一些城市旅遊

Floyd-Warshall演算法

Floyd演算法是用來找出每對頂點之間的最短距離,即適用於多源最短路經,它對圖的要求是,既可以是無向圖也可以是有向圖,邊權可以為負,但是不能存在負環(可根據最小環的正負來判定). 具體可閱讀以下博文: 問題集錦:

floydwarshall演算法演算法的理解,就一句話

floydwarshall algorithm(弗洛伊德演算法):對每一個頂點,都要嘗試它作為任一對頂點的中轉頂點的可能性。基於此,形成一個基礎資料庫。在這個基礎資料庫的基礎上,追溯出任意兩點的最短路徑。 對幾個疑問的解釋: 1.簡單的迴圈條件,如for (k=0;k&l

最短路徑演算法

1 原理 ,假設存在一個最簡單的連通圖 2 程式碼 package leaning.graph; /* * * 弗洛伊德演算法求最短路徑 * * */ public class Floyd { // 表示V0頂點到v8頂點的最短

Floyd algorithm!!!!!萬惡的演算法

        曾經有位滑稽的博主說過:搜尋就是優雅的暴力。今天他又要說,DP就是優雅地搜尋。         不是每一個弗洛伊德都寫演算法,也不是寫演算法的都叫弗洛伊德,還有一位人家寫性學三論去了。         這位弗洛伊德來歷不一般,斯坦福大學的教授,1978年的

HDU 1217 Arbitrage(演算法

Arbitrage Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 8989    Accepted Subm

最短路徑算法

creat github lib tab auth logs sca for maxsize 假設條件同上。。 整個算法最核心的,個人覺得就是一個公式: weight[a][b] = min{weight[a][b], weight[a][c]+weight[c][b]}

數據結構圖---最短路徑算法

直接 char getchar 更新 none typedef article truct 使用 一:定義 弗洛伊德算法是用來求所有頂點到所有頂點的時間復雜度。 雖然我們可以直接對每個頂點通過迪傑斯特拉算法求得所有的頂點到所有頂點的時間復雜度,時間復雜度為O(n*3)

拓撲排序以及迪傑斯特拉演算法演算法的一些例子天勤資料結構

拓撲排序核心演算法     在一個有向圖中找到一個拓撲排序的過程如下:     1)從一個有向圖中選擇一個沒有前驅(入度為0)的頂點輸出;     2)刪除1)中的頂點,並刪除從該頂點出發的全部邊;  

關於需要記錄路徑的最短路

弗洛伊德用來求單、多源最短路都很常見,然而有些題一定要記錄路徑,很煩,不會的又重新用暴力,爆零也很常見。 真是氣skr人。 其實,時間複雜的確實會比較高,但是也比暴力好,是O(n^3+ n^4)。 首先,還是要走一遍弗洛伊德,記錄最優解。這裡O(n^3);

最短路徑 單源最短路徑Dijkstra迪傑斯特拉演算法 Floyd演算法

兩個演算法的主要思想都是鬆弛,就是兩點間的距離通過第三點來變短 比如   1->3=10     1->2=2   2->3=5    這樣你就可以通過2號點把1,3兩點的距離縮短為7 Dijkstra演算法被稱為單源最短路,意思就是隻能計算某個點到

資料結構篇:校園最短路徑導航二:演算法理解與應用

求最短路徑最常用的有迪傑斯特拉(Dijkstra)和弗洛伊德(Floyd)演算法兩種。本著簡潔為王道的信條,我選擇了Floyd演算法。 Floyd演算法 首先來看一個簡單圖,紅色標記代表在陣列的下標,橙色標記代表距離(邊權值) 我們用D[6][6]這個矩陣儲存兩點之間最短路徑,

函式的魔法 查最短路

連結:https://ac.nowcoder.com/acm/contest/326/C 來源:牛客網   題目描述 一位客人來到了此花亭,給了女服務員柚一個數學問題:我們有兩個函式,F(X)函式可以讓X變成(X*X*X+X*X)mod 233。G(X)函式可以讓X變成(X*X*X

資料結構之圖最短路徑之Floyd演算法

1)弗洛伊德演算法是求圖最短路徑的另外一種演算法,其適用於求圖中任意兩節點之間最短路徑; 2)其基本思想也是動態規劃,時間複雜度是O(N^3),N代表節點個數; 3)動態規劃的實現步驟是:a)找出問題的最優子結構;b)根據最優子結構求出遞迴解;c)以自下而上的方式求出最優解

演算法-----最短路徑演算法

學習此演算法的原因:昨天下午遛彎的時候,碰到閨蜜正在看演算法,突然問我會不會弗洛伊德演算法?我就順道答應,然後用了半個小時的時間,學習了此演算法,並用5分鐘講解給她聽,在此也分享給各位需要的朋友,讓你們在最短的時間內,透徹的掌握該演算法。 Robert W. Floyd(

多源最短路徑演算法java不含具體路徑

  Floyd-Warshall演算法(Floyd-Warshall algorithm)是解決任意兩點間的最短路徑的一種演算法,可以正確處理有向圖或負權的最短路徑問題。   import java.util.Arrays; public class Florid

最短路之Floyd演算法

弗洛伊德演算法的作用是可以求任意兩點的最短路問題,時間複雜度為O(n^3)。 先舉個栗子: 例如求1->3的最短路徑,首先找出所有可以從1->3的路徑。 1->2+2->

傻子也能看懂的演算法

        我們來想一想,根據我們以往的經驗,如果要讓任意兩點(例如從頂點a點到頂點b)之間的路程變短,只能引入第三個點(頂點k),並通過這個頂點k中轉即a->k->b,才可能縮短原來從頂點a點到頂點b的路程。那麼這個中轉的頂點k是1~n中的哪個點呢?甚至有時候不只通過一個點,而是經過兩個點或