您的位置:首页 > 其它

UVA 1267 - Network

2014-04-18 15:19 387 查看
要先把无根数转成有根数,然后不断的查找不符合的叶子,再更新就行了

#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 2
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
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
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: