四川省赛 E.Don‘t Really Like How The Story Ends(贪心dfs)
#include<bits/stdc++.h>
using namespace std;
//定义部分
const int maxn = 1e5+100;
int t,n,m,u,v,ans,tot; //变量tot计算当前遍历到哪一个数
vector<int>edge[maxn];
void dfs(int u)
{
if(u == n+1) return;
for(auto x:edge[u])
{
if(x < tot) continue;
while( x >= tot )
{
if(x==tot) tot++, dfs(x);
else
{
tot++; ans++; dfs(tot-1);
}
}
}
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
edge[u].push_back(v);
edge[v].push_back(u);
}
//题目中按照DFS顺序排列所以对邻接表中的元素排序
for(int i=1;i<=n;i++)
sort(edge[i].begin(), edge[i].end());
//保证1~n的点全部被遍历一遍
edge[1].push_back(n+1);
tot=2, ans=0;
dfs(1);
printf("%d\n",ans);
for(int i=1;i<=n;i++) edge[i].clear();
}
return 0;
}
//***********************************************************************************
//题目中是按照dfs顺序给出编号,所以从1结点开始,第二个点必须是和2相连
//1.如果结点1不和结点2相连,加边 ans++
//2.如果相连遍历dfs(2),如果结点2和3相连dfs(3),依次类推
//如果不和3相连并且不与其他任何结点相连,返回上一结点,因为在结点1加边结果不会比结2差
// 如果结点2和结点3以外的边相连接则需要加边ans++