题目因为要求保密就不放出来了。
思路
就是求最小支配集。
逆向递归贪心算法。
按逆递归的方向来,若当前节点不在支配集内,也不和支配集相连,且它的父节点不在支配集内,就把它的父节点放到支配集里面去。
这题一开始我把vis放到下面去了
像这样:
void dfs(int u, int from)
{
bool flag=0;
for(int i=head[u] ; ~i ; i=g[i].next)
{
int v=g[i].v;
if(!vis[v])
{
vis[v]=1;//放在这了
dfs(v,u);
flag|=set[v];
}
}
...
}
这样有个BUG就是根节点会标记不上,需要在调用前标记上。直接导致我WA了一下午……
把它放到前面去就行了:
void dfs(int u, int from)
{
vis[u]=1;//这里
bool flag=0;
for(int i=head[u] ; ~i ; i=g[i].next)
{
int v=g[i].v;