俗話說:「條條大路通羅馬」
範例測資
範例輸入 | 範例輸出 |
---|---|
EOF 輸入,每筆輸入有兩個正整數 N 和 M (N <= 800,M <= 10000) 代表有 N 個城市 M 條道路! 請注意,道路是有方向性的! 接下來有 M 行, 每行有 2 個正整數 a 和 b (1 <= a,b <= N) 代表 a 城市 可以到 b 城市 最後一行有兩個正整數 A 和 B (1 <= A,B <= N) | 如果 A 城市 可以到達 B 城市, 請輸出「Yes!!!」 不行請輸出「No!!!」 |
8 32 7 4 2 5 7 5 3 7 2 1 2 2 2 4 4 4 4 7 8 5 7 5 5 2 6 7 7 5 8 8 4 7 6 3 4 1 4 4 8 7 3 4 2 6 6 1 6 8 4 5 7 5 6 6 4 4 2 6 5 3 7 4 1 3 1 3 | Yes!!! |
解題思路
使用 Map<int, vector<int>> 來存取哪些城市可以通往哪些城市,並且用 BFS 的方式尋找哪些城市可以通往哪些城市,每次進到 BFS 的時候需要判斷哪些城市已經被 Push_Back 到下一次的起點了,如果已經被 Push_Back 過的起點就不再 Push_Back。
如果走到終點城市就可以輸出 Yes,如果遇到起點的陣列長度為 0 就代表永遠走不到輸出No。
範例程式碼-ZeroJudge A290: 新手訓練系列 ~ 圖論
#include <iostream>
#include <map>
#include <vector>
using namespace std;
map<int, vector<int>>MAP;
int N, M, start, finish;
void BFS(vector<int>start)
{
if (start.size() == 0)
{
cout << "No!!!\n";
return;
}
vector<int>newStart;
map<int, int>appear;
for (int i = 0; i<start.size(); i++)
{
vector<int>step = MAP[start[i]];
for (int j = 0; j<step.size(); j++)
{
if (step[j] == finish)
{
cout << "Yes!!!\n";
return;
}
if (appear[step[j]] == 0)
{
appear[step[j]]++;
newStart.push_back(step[j]);
}
}
}
BFS(newStart);
}
int main() {
cin.sync_with_stdio(0);
cin.tie(0);
while (cin >> N >> M)
{
MAP.clear();
for (int i = 0; i<M; i++)
{
int a, b;
cin >> a >> b;
MAP[a].push_back(b);
}
cin >> start >> finish;
vector<int>v;
v.push_back(start);
BFS(v);
}
}
//ZeroJudge A290
//Dr. SeanXD