找朋友
找朋友:已知一組人名對,他們互為朋友關係,輸入乙個人名對,找到兩個人認識的最短關係路徑
例如:, , , , ,
輸入:輸出: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 #includeview code6 #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*/
A 搜尋求最短路
以下文章 原來這就是傳說中的a 第一次寫的a 多多感謝alpc55推薦的這道好題。先說說原先讀到這到題目的想法,以前也聽講過k短路,我還以為就是多做幾次dijkstra,或是在dijkstra演算法選邊的時候控制一些條件。聽alpc55說是用a 啟發式搜尋,直接使用廣度優先搜尋會暴空間。當時聽著也不...
回溯法找迷宮最短路徑
有乙個二維陣列,0表示路,1表示牆,求其中任意兩點的最短路徑 我們先看,怎麼求一條路徑 求兩點路徑是乙個資料結構上的典型的迷宮問題,解決辦法如下 從一點開始出發,向四個方向查詢 上,右,下,左 每走一步,把走過的點的值 1,防止重複行走,並把走過的點壓入堆疊 表示路徑 如果遇到牆 或者已走過的點則不...
最短路徑 孫悟空找唐僧
唐僧被妖怪關在迷宮中。孫悟空好不容易找到一張迷宮地圖,並通過乙個魔法門來到來到迷宮某個位置。假設迷宮是乙個n m的矩陣,它有兩種地形,0表示平地,1表示沼澤,孫悟空只能停留在平地上。孫悟空目前的位置在座標 sx,sy 處,他可以向上下左右四個方向移動。請你幫助孫悟空計算一下,迷宮中是否存在一條路從他...