UVA 1267 - Network

来源:互联网 发布:网络综艺节目排行榜 编辑:程序博客网 时间:2024/06/04 18:38

要先把无根数转成有根数,然后不断的查找不符合的叶子,再更新就行了

#include <cstdio>#include <algorithm>#include <vector>#include <cstring>using namespace std;int n;vector<int> vvv[1005];vector<int> tree[1005];int father[1005];int visited[1005];int s,k;int maxd;int ccc;void gen_tree(int node,int fa,int d){    if(d>maxd)        maxd=d;    father[node]=fa;    int len=vvv[node].size();    if(len==1 && d>k){        tree[d].push_back(node);    }    for(int i=0;i<len;i++){        if(father[vvv[node][i]]==0)            gen_tree(vvv[node][i],node,d+1);    }}void dfs(int node,int d){    if(d>k)        return;    if(vvv[node].size()==1){    visited[node]=1;    }    for(int i=0;i<vvv[node].size();i++){        int v=vvv[node][i];        dfs(v,d+1);    }}void solve(){    for(int i=maxd;i>k;i--){        for(int j=0;j<tree[i].size();j++){            int v=tree[i][j];            if(visited[v])                continue;            for(int l=0;l<k;l++)                v=father[v];            ccc++;            dfs(v,0);        }    }}int main(){    int i,j;    int T;    scanf("%d",&T);    while(T--){        memset(father,0,sizeof(father));        memset(visited,0,sizeof(visited));        ccc=0;        maxd=0;        scanf("%d",&n);        scanf("%d %d",&s,&k);        int a,b;        for(i=0;i<n-1;i++){            scanf("%d %d",&a,&b);            vvv[a].push_back(b);            vvv[b].push_back(a);        }        gen_tree(s,-1,0);        solve();        printf("%d\n",ccc);        for(i=0;i<=n;i++){      vvv[i].clear();    tree[i].clear();        }    }    return 0;}/*2 14 12 21 2 2 3 3 4 4 5 5 6 7 5 8 5 4 9 10 3 2 12 12 14 13 14 14 11 14 3 4 1 2 2 3 3 4 4 5 5 6 7 5 8 5 4 9 10 3 2 12 12 14 13 14 14 11*/


0 0
原创粉丝点击