Don’t Really Like How The Story Ends
2021年省赛E题
题目链接
题意 :
给定n个点(1 ~ n),还有m条已经链接的边,问需要加多少条边可以形成一个dfs序(即按照dfs遍历的顺序)
思路 :
如果按顺序两个点没有直接连接,并且不能通过回溯到达,那么必须加一条边
所以条件采用while
列如 :
1
5 2
1 2
3 5
2 和 3 之间加一条边,3 和 4 之间需要加一条边,但是4 和 5之间不需要,因为4可以通过3回溯后搜索到5;
== AC代码 : ==
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
#include <map>
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
vector<int> v[N];
int cnt,now;
int n,m;
void dfs(int u)
{
if(u == n + 1) return ;
for(int i = 0;i < v[u].size(); ++ i)
{
while(v[u][i] >= now){
if(v[u][i] == now){
++ now;
dfs(now - 1);
}else{
++ cnt;
++ now;
dfs(now - 1);
}
}
}
}
int main()
{
IOS;
int t;cin >> t;
while(t --)
{
cnt = 0,now = 2;
cin >> n >> m;
for(int i = 1;i <= m;++ i)
{
int a,b;
cin >> a >> b;
v[a].push_back(b);
v[b].push_back(a);
}
v[1].push_back(n + 1);
for(int i = 1;i <= n;++ i){
sort(v[i].begin(),v[i].end());
}
dfs(1);
cout << cnt << endl;
for(int i = 1;i <= n;++ i) v[i].clear();
}
return 0;
}