uva1267(无根树 +dfs)

来源:互联网 发布:滁州学院网络教学平台 编辑:程序博客网 时间:2024/06/06 04:46

题意:

在一张图中,有n个点,要建几个服务站,服务站可以服务离他距离为k的点;一开始只有一个服务站;

现在给出有几组样例,每组样例给出有n个点,最开始的服务站位置start,还有服务站的服务距离dis:


思路:

首先我们要以最开始的服务站为根,先建一棵树.那么深度为dis的结点就全都可以访问到了;

那么哪些结点最有可能访问不到?就是深度最深的;

所以我们建好树后,把节点按照从大到小排序,然后访问,如果这个节点没被服务到,就从这个节点往上找dis的距离,把那个点建服务站'


AC:


#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int N = 1005;int u[N * 2],v[N * 2],nex[N * 2],first[N * 2],e;int n,start,dis,ans,vis[N];int num,fa[N];struct treenode {int id;int deep;}node[N];int cmp(treenode a , treenode b) {return a.deep > b.deep;}void add(int l , int r) {u[e] = l;v[e] = r;nex[e] = first[u[e]];first[u[e]] = e;e++;u[e] = r;v[e] = l;nex[e] = first[u[e]];first[u[e]] = e;e++;}void buildtree(int cur , int deep,int p) {node[num].id = cur;node[num++].deep = deep;fa[cur] = p;for(int i = first[cur] ; i != -1 ; i = nex[i]) {int x = v[i];if(x != p)buildtree(x , deep + 1, cur);}}void cover (int cur , int p , int deep) {if(deep > dis)return;vis[cur] = 1;for(int i = first[cur] ; i != -1 ;i =nex[i]) {int x = v[i];if(x != p) {cover(x , cur , deep + 1);}}}void solve() {for(int i = 0 ; node[i].deep > dis ; i++) {//for(int j = first[node[i].id] ; j != -1 ; j = nex[j]) {int x = node[i].id;if(nex[first[x]] != -1)continue;if(!vis[x]) {int pos = x;for(int k = 0 ; k < dis ;k++) {pos = fa[pos];}cover(pos , -1 , 0);ans++;}//}}}int main() {int t;scanf("%d",&t);while(t--) {e = 0;ans = 0;num = 0;memset(first , -1 , sizeof(first));memset(nex , -1 ,sizeof(nex));scanf("%d%d%d",&n,&start,&dis);int a,b;for(int i = 0 ; i < n - 1 ; i++) {scanf("%d%d",&a,&b);add(a,b);}buildtree(start , 0 , -1);sort(node , node + num , cmp);memset(vis , 0 ,sizeof(vis));solve();printf("%d\n",ans);}}


0 0
原创粉丝点击