http://codeforces.com/problemset/problem/369/C

树的遍历,dfs搜一下,从根节点搜到每个分叉末尾,记录一下路况,如果有需要修复的,就把分叉末尾的节点加入答案

10w个点要用邻接表存图

#include <iostream>
using namespace std ;
typedef struct L{
    int s,t ;
    int v ;
    int nxt ; 
}L ;
L e[200005] ;
int head[100005] ;
int cnt ;
void ins(int s,int t,int v)
{
    e[cnt].t=t ;
    e[cnt].v=(v==2) ;
    e[cnt].nxt=head[s] ;
    head[s]=cnt++ ;
}
int ct ;
int ans[100005] ;
int vis[200005] ;
int dfs(int s,int droad)
{
    int flag=0 ;
    for(int i=head[s] ;i!=-1 ;i=e[i].nxt)
    {
        if(!vis[i])
        {
            if(i&1)
                vis[i-1]=1 ;
            else
                vis[i+1]=1 ;
            flag=dfs(e[i].t,e[i].v) || flag ;
        }
    }
    if(droad && flag==0)
    {
        ans[ct++]=s ;
        return 1 ;
    }
    return flag ;
}
void solve()
{
    ct=0 ;
    dfs(1,0) ;
    printf("%d\n",ct) ;
    for(int i=0 ;i<ct ;i++)
    {
        if(!i)
            printf("%d",ans[i]) ;
        else
            printf(" %d",ans[i]) ;
    }
    putchar('\n') ;
}
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        memset(head,-1,sizeof(head)) ;
        memset(vis,0,sizeof(vis)) ;
        cnt=0 ;
        for(int i=0 ;i<n-1 ;i++)
        {
            int a,b,c ;
            scanf("%d%d%d",&a,&b,&c) ;
            ins(a,b,c) ;ins(b,a,c) ;
        }
        solve() ;
    }
    return 0 ;
}
View Code