搜尋 最短路 找朋友

2022-06-19 23:42:12 字數 1684 閱讀 5583

找朋友

找朋友:已知一組人名對,他們互為朋友關係,輸入乙個人名對,找到兩個人認識的最短關係路徑

例如:, , , , ,

輸入:輸出:mike,lucy,sean

注意:1. 兩個人可能無法建立朋友關聯。 2. 如果同時存在兩條最短路徑,只要任意輸出一組。

1、首先flody處理圖中任意兩點的距離。

2、然後通過 dis( a->b ) + dis( b->c ) == dis( a -> c ) 作為依據來處理是否必經b點。

3、利用(2)進行dfs搜尋,最後列印路徑

1 #include2 #include3 #include4 #include5 #include

6 #include7

using

namespace

std;89

const

int n = 1e3 + 10

;10 map< string , int >name2num ;

11 map< int , string >num2name ;

12 vector< vector >g;

13int cnt = 0;14

intpath[n],dis[n][n];

15int

vis[n] ;

16int flag = 0;17

18void add_edge( string u , string

v )26

27void

print_path()

31//

cout << " ######## "<< endl;

32 cout <

3435

void dfs( int no , int s , int

end )

41if( flag ) return;42

43//

利用dis[s][to] + dis[to][end] == dis[s][end](最短路徑)的特點

44for(int i = 0 ; i < (int)g[no].size() ; i++)54}

5556}57

58int

main()

5972

if( name2num[v] == 0

)

76add_edge( u , v );77}

7879

//利用flody來計算圖中任意兩點間距離

80for( int k = 1 ; k <= n ; k ++)87}

88}89}

9091

//用dfs再次搜尋一遍.

92string

s , e ;

93 cin >> s >>e ;

94if( dis[ name2num[s] ][ name2num[e] ] == 0x3f3f3f3f

)else

101return0;

102}

103/*

1046

105m l

106m j

107j a

108a s

109l a

110l s

111112

m s113

114output:

115m l s

116*/

view code

A 搜尋求最短路

以下文章 原來這就是傳說中的a 第一次寫的a 多多感謝alpc55推薦的這道好題。先說說原先讀到這到題目的想法,以前也聽講過k短路,我還以為就是多做幾次dijkstra,或是在dijkstra演算法選邊的時候控制一些條件。聽alpc55說是用a 啟發式搜尋,直接使用廣度優先搜尋會暴空間。當時聽著也不...

回溯法找迷宮最短路徑

有乙個二維陣列,0表示路,1表示牆,求其中任意兩點的最短路徑 我們先看,怎麼求一條路徑 求兩點路徑是乙個資料結構上的典型的迷宮問題,解決辦法如下 從一點開始出發,向四個方向查詢 上,右,下,左 每走一步,把走過的點的值 1,防止重複行走,並把走過的點壓入堆疊 表示路徑 如果遇到牆 或者已走過的點則不...

最短路徑 孫悟空找唐僧

唐僧被妖怪關在迷宮中。孫悟空好不容易找到一張迷宮地圖,並通過乙個魔法門來到來到迷宮某個位置。假設迷宮是乙個n m的矩陣,它有兩種地形,0表示平地,1表示沼澤,孫悟空只能停留在平地上。孫悟空目前的位置在座標 sx,sy 處,他可以向上下左右四個方向移動。請你幫助孫悟空計算一下,迷宮中是否存在一條路從他...