題目敘述
本題採用EOF方式收資料,每筆資料第一行有兩個正整數N和M,借下來會有M行,每行有兩個正整數a和b,代表城市a可以走到城市b,但是只能單向通過不能雙向,最後會有兩個正整數c和d。要求輸出是否能從城市c走到城市d。
範例輸入 #1
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
範例輸出 #1
Yes!!!
解題思路
使用Map<int, vector<int>>來存取哪些城市可以通往哪些城市,並且用BFS的方式尋找哪些城市可以通往哪些城市,如果走到終點城市就可以輸出Yes。
解題程式碼如下 (僅供參考):
#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);
}
}
留言
張貼留言