Zoj3820 Building Fire Stations tree diameter + binary, zoj3820stations

Source: Internet
Author: User

Zoj3820 Building Fire Stations tree diameter + binary, zoj3820stations

Http://acm.zju.edu.cn/onlinejudge/showProblem.do? ProblemCode = 3820.

Building Fire Stations Time Limit: 5 Seconds Memory Limit: 131072 KB Special Judge

Marjar University is a beautiful and peaceful place. There areNBuildings andN-1 bidirectional roads in the campus. these buildings are connected by roads in such a way that there is exactly one path between any two buildings. by coincidence, the length of each road is 1 unit.

To ensure the campus security, Edward, the headmaster of Marjar University, plans to setup two fire stations in two different buildings so that firefighters are able to arrive at the scene of the fire as soon as possible whenever fires occur. that means the longest distance between a building and its nearest fire station shocould be as short as possible.

As a clever and diligent student in Marjar University, you are asked to write a program to complete the plan. Please find out two proper buildings to setup the fire stations.

Input

There are multiple test cases. The first line of input contains an integerTIndicating the number of test cases. For each test case:

The first line contains an integerN(2 <=N<= 200000 ).

For the nextN-1 lines, each line contains two integersXiAndYi. That means there is a road connecting buildingXiAnd buildingYi(Indexes are 1-based ).

Output

For each test case, output three integers. the first one is the minimal longest distance between a building and its nearest fire station. the next two integers are the indexes of the two buildings selected to build the fire stations.

If there are multiple solutions, any one will be acceptable.

Sample Input
241 21 31 451 22 33 44 5
Sample Output
1 1 21 2 4
Author: YU, Xiaoyao; ZHUANG, Junyuan

Select two points for a tree as the fire brigade to minimize the maximum distance between the other points and the nearest fire brigade.

Question: If it is a point, it must be the focus of the tree diameter (center of gravity). If it is two points, it is not difficult to think that it must be on the diameter! In fact, this anti-Evidence method is very good.

Specific proof can see the subject of strict proof: http://blog.renren.com/blog/240107793/937020122

So first, bfs finds the diameter, and then we have two answers to find the two points with the distance from the diameter endpoint equal to mid and then bfs.

It is said that we can find out the diameter of the center to separate the two subtree and then find the two subtree diameter center is the answer, so I wrote a few hair has not passed, changed to the second point is over 233 ..

Code:

/** * @author neko01 *///#pragma comment(linker, "/STACK:102400000,102400000")#include <cstdio>#include <cstring>#include <string.h>#include <iostream>#include <algorithm>#include <queue>#include <vector>#include <cmath>#include <set>#include <map>using namespace std;typedef long long LL;#define INF 0x3f3f3f3f#define min3(a,b,c) min(a,min(b,c))#define max3(a,b,c) max(a,max(b,c))#define pb push_back#define mp(a,b) make_pair(a,b)#define clr(a) memset(a,0,sizeof a)#define clr1(a) memset(a,-1,sizeof a)#define dbg(a) printf("%d\n",a)typedef pair<int,int> pp;const double eps=1e-8;const double pi=acos(-1.0);const int N=200005;vector<int>g[N];int dist[N];int dist1[N];int pre[N];vector<int>ans;int n;void bfs(int s,int &x,int &l)   {    clr1(dist);    clr1(pre);    dist[s]=0;    x=s,l=0;    queue<int>q;    q.push(s);    int u,v;    while(!q.empty())    {        u=q.front();        q.pop();        for(int i=0;i<g[u].size();i++)        {            int v=g[u][i];            if(dist[v]==-1)            {                dist[v]=dist[u]+1;                q.push(v);                pre[v]=u;                if(dist[v]>l)                {                    l=dist[v];                    x=v;                }            }        }    }}void bfs1(int s,int dist[]){    dist[s]=0;    queue<int>q;    q.push(s);    int u,v;    while(!q.empty())    {        u=q.front();        q.pop();        for(int i=0;i<g[u].size();i++)        {            int v=g[u][i];            if(dist[v]==-1)            {                dist[v]=dist[u]+1;                q.push(v);            }        }    }}bool check(int mid,int &ans1,int &ans2){    int sz=ans.size();    ans1=ans[mid];    ans2=ans[sz-mid-1];    clr1(dist);    bfs1(ans1,dist);    clr1(dist1);    bfs1(ans2,dist1);    for(int i=1;i<=n;i++)    {        if(min(dist[i],dist1[i])>mid)            return false;    }    return true;}int main(){    int t;    scanf("%d",&t);    while(t--)    {        int u,v;        scanf("%d",&n);        for(int i=1;i<=n;i++)        {            g[i].clear();        }        ans.clear();        for(int i=1;i<n;i++)        {            scanf("%d%d",&u,&v);            g[u].pb(v);            g[v].pb(u);        }        int x,y,ll;        bfs(1,x,ll);        bfs(x,y,ll);        while(y!=-1)        {            ans.pb(y);            y=pre[y];        }        int sz=ans.size();        int l=0,r=ll/2+1,res,ans1,ans2;        while(l<=r)        {            int mid=(l+r)>>1;            if(check(mid,ans1,ans2))            {                res=mid;                r=mid-1;            }            else l=mid+1;        }        check(res,ans1,ans2);        if(ans1==ans2) ans2=ans2%n+1;        printf("%d %d %d\n",res,ans1,ans2);    }    return 0;}







Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.