1470D - Strange Housing(dfs)
题意
给定 n n n 个房子 m m m 条路的无向图,要求你选出一部分点来给老师居住(其他给学生居住)并升序输出这些点,要求满足以下要求:
- 如果一个路连接的两个房子都没有老师居住那么这条路将会被关闭;
- 只有未被关闭的路能走,且要求全图连通(在只能走开启的路的情况下);
- 老师和老师的居住点不能直接相连。
思路
题面翻译:分配完以后还要是连通图,以及一条边两个点不能都是老师的住所
参考:Codeforces1470 D. Strange Housing(图构造)
主要思路:dfs。先把任意一个点染黑,然后把这个点连着的所有点染白,再把所有边上有白点且无黑点的点染黑,以此类推。
刚刚做过L2-013 红色警报 (25 分)感觉两个题目很像
代码
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define PI acos(-1)
#define pb push_back
using namespace std;
typedef pair<int, int> P;
typedef long long ll;
const int N = 3e5 + 19;
const ll mod = 1e9 + 7;
vector<int> vec[N];
queue<int> que;
int a[N];
int n, m;
void init(int n)
{
fill(a, a + n + 1, 0);
while(!que.empty())
que.pop();
for(int i = 0; i <= n; i++)
vec[i].clear();
}
void dfs(int x)
{
int flag = 1;
for(int i = 0; i < vec[x].size(); i++)
{
if(a[vec[x][i]] == 1)//1:black
{
flag = -1;//-1:white
break;
}
}
a[x] = flag;
for(int i = 0; i < vec[x].size(); i++)
{
if(!a[vec[x][i]])
dfs(vec[x][i]);
}
}
int main()
{
int T;
cin >> T;
while(T--)
{
cin >> n >> m;
init(n);
for(int i = 0, u, v; i < m; i++)
{
cin >> u >> v;
vec[u].pb(v);
vec[v].pb(u);
}
dfs(1);
bool flag = 0;
for(int i = 1; i <= n; i++)
{
if(!a[i])
{
flag = 1;
break;
}
if(a[i] == 1)
{
que.push(i);
}
}
if(flag)
{
cout << "NO" << endl;
continue;
}
cout << "YES\n" << que.size() << endl;
while(!que.empty())
{
cout << que.front() << ' ';
que.pop();
}
cout << endl;
}
return 0;
}
明天就返校啦o((>ω< ))o