/*
8 2
0 2
0 6
*/
/*
8 2
0 1
1 7
*/
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int main()
{
int n, e;
cin >> n >> e;
vector<vector<int>> shoudong(n, vector<int>());
for (int i = 0; i < e; i++)
{
int a, b;
cin >> a >> b;
shoudong[a].push_back(b);
}
vector<int> fadongji(n, 0);
int shike = 0;
int qidongxinghao = 0; // 已经启动了就一直置为1
int yijingqidong = 0; // 已经启动的发动机的个数
queue<int> pre_qidong; // 上个时刻启动的发动机
vector<int> zuihoufadongji; // 最后时刻启动的发动机
while (true)
{
// 关联启动
if (shike > 0 && qidongxinghao == 1)
{
int size = pre_qidong.size();
for (int k = 0; k < size; k++)
{
int i = pre_qidong.front();
pre_qidong.pop();
if (i == 0)
{
if (fadongji[n - 1] == 0)
{
yijingqidong++;
fadongji[n - 1] = 1;
pre_qidong.push(n - 1);
zuihoufadongji.push_back(n - 1);
}
if (fadongji[1] == 0)
{
yijingqidong++;
fadongji[1] = 1;
pre_qidong.push(1);
zuihoufadongji.push_back(1);
}
}
else if (i == n - 1)
{
if (fadongji[0] == 0)
{
yijingqidong++;
fadongji[0] = 1;
pre_qidong.push(0);
zuihoufadongji.push_back(0);
}
if (fadongji[n - 2] == 0)
{
yijingqidong++;
fadongji[n - 2] = 1;
pre_qidong.push(n - 2);
zuihoufadongji.push_back(n - 2);
}
}
else
{
if (fadongji[i - 1] == 0)
{
yijingqidong++;
fadongji[i - 1] = 1;
pre_qidong.push(i - 1);
zuihoufadongji.push_back(i - 1);
}
if (fadongji[i + 1] == 0)
{
yijingqidong++;
fadongji[i + 1] = 1;
pre_qidong.push(i + 1);
zuihoufadongji.push_back(i + 1);
}
}
}
if (yijingqidong < n) // 循环出口
{
zuihoufadongji.clear();
}
else
{
break;
}
}
if (yijingqidong >= n) // 循环出口
{
break;
}
// 手动启动
if (!(shoudong[shike].empty()))
{
for (int i = 0; i < shoudong[shike].size(); i++)
{
if (fadongji[shoudong[shike][i]] == 0)
{
fadongji[shoudong[shike][i]] = 1;
yijingqidong++;
if (yijingqidong == n) // 循环出口
{
zuihoufadongji.push_back(shoudong[shike][i]);
break;
}
pre_qidong.push(shoudong[shike][i]);
}
}
qidongxinghao = 1;
}
if (yijingqidong >= n) // 循环出口
{
break;
}
if (qidongxinghao == 0)
{
continue;
}
shike++;
}
cout << zuihoufadongji.size() << endl;
for (int i = 0; i < zuihoufadongji.size(); i++)
{
cout << zuihoufadongji[i];
if (i != zuihoufadongji.size() - 1)
{
cout << " ";
}
}
return 0;
}
流浪地球算法题
最新推荐文章于 2024-09-30 18:03:06 发布