【dfs】【树】机器选择
機器選擇
題目大意:
有一個樹狀的圖,要求安一個點,使這個點到最遠的點的距離最小
原題:
題目描述
自從省隊NOI賽前集訓在scz舉行之后,一個名叫cs1.6.exe的文件開始在機房廣泛使用起來。每天大家都要找神犇小X借移動硬盤,考里面的這個文件。
由于機房里需要考這個文件的人太多了,每天都要花一段時間一個人一個人的去拷貝。小T覺得這實在是太麻煩了,就想找一個一勞永逸的方法。
小T調查了一下,機房有n臺機器,且有局域網,所有機器通過一些網線連接起來,其整個布局是一個樹形結構,即任意兩臺機器間都有且僅有一條路徑。小T想在其中某一臺機器上儲存這個文件,需要的同學就可以直接通過局域網來下載這個文件。
網絡上信息傳輸是需要時間的,我們定義兩臺機器間數據傳輸的時間為連接這兩臺機器的路徑所包含的網線數量。雖然機房里通過局域網傳個文件是很快的,但對于急不可耐的同學們來說,一分一秒都是寶貴的,文件傳輸越快越好。所以小T要選擇一臺機器存儲文件,使得所有機器下載這個文件需要的總時間(即最后一臺機器完成下載的時間)盡可能短。
現在,你需要給出這個最短時間,以便讓小T看看他的決策是否最優。
輸入
第1行:一個整數n。
第2n行:兩個整數u、v,即u、v兩臺機器間有一條網線連接。機器從1n編號。
輸入數據保證是一個連通的樹型結構。
輸出
1行一個整數,即最短的時間。
輸入樣例
5 3 2 2 1 5 2 2 4輸出樣例
1說明
【數據范圍】
對于30%的數據,n≤100;
對于50%的數據,n≤1000;
對于100%的數據,2≤n≤100000。
解題思路:
直接暴力搜可以拿50分
想要拿100分就要先求出這棵樹的直徑,然后除以2就可以了
代碼:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> using namespace std; int n,m,x,y,w,k,ans,p[100005],head[100005]; struct rec {int to,next; }a[200005]; void dfs(int dep,int s) {p[dep]=1;//記錄if (s>ans) ans=s,k=dep;//代替for (int i=head[dep];i;i=a[i].next)if (!p[a[i].to]) dfs(a[i].to,s+1);//搜下去p[dep]=0; } int main() {int size = 256 << 20;char*p=(char*)malloc(size) + size;__asm__("movl %0, %%esp\n" :: "r"(p) );//開棧scanf("%d",&n);for (int i=1;i<n;++i){scanf("%d %d",&x,&y);a[++w].to=y;//存線路a[w].next=head[x];head[x]=w;a[++w].to=x;a[w].next=head[y];head[y]=w;}dfs(1,0);ans=0;dfs(k,0);//求直徑printf("%d",(ans+1)/2);//除以2(加1是因為他是由0開始的) }總結
以上是生活随笔為你收集整理的【dfs】【树】机器选择的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 宋轶怎么读
- 下一篇: 初一级练习题(2019.3.8)