int dfs(int u, int p)
{
int left=2;
for(int i=0; i<vec[u].size(); i++)
{
int v = vec[u][i];
if(v==p) continue;
int x = dfs(v, u);
if(left>0 && x==1)
{
ans++;
left--;
}
}
return left>0 ? 1:0;
{
int left=2;
for(int i=0; i<vec[u].size(); i++)
{
int v = vec[u][i];
if(v==p) continue;
int x = dfs(v, u);
if(left>0 && x==1)
{
ans++;
left--;
}
}
return left>0 ? 1:0;
}
这是个有向循环图,vec[i][j]表示从i到j;
从完全图中搜索尽可能多的生成树的树枝。这里left有很神奇的功能当存在分叉时节点返回值。
例如
1->2
2->3
3->4
这时 节点3,4返回1.ans=2;
节点2返回 0 使节点1的ans=3;没有增加多余树枝。