話說寧波市的中小學生在鎮海中學參加計算機程式設計比賽,比賽之餘,他們在鎮海中學的各個景點參觀。鎮海中學共有n個景點,每個景點均有若干學生正在參觀。這n個景點以自然數1至n編號,每兩個景點的編號均不同。每兩個景點之間有且只有一條路徑。選擇哪個景點集中的學生,才能使所有學生走過的路徑之和最小呢?
如果存在多個解,則輸出距離1最近的那個點,可以證明答案唯一
輸入檔案center.in中有若干行:
第一行只有乙個正整數n,表示景點數。
第二行有n個1至1000間的整數,這n個整數間互相以乙個空格分隔。其中第i個整數表示第i個景點處的學生數。
第三行至第n+1行,每行有三個整數i,j,k,表示景點i和景點j之間有一條長尾k的路徑直接連線。其中i<>j,1≤i≤n,1≤j≤n;1≤k≤1000。
輸出檔案center.out中有二行;
第一行只有乙個整數i,表示在第i個景點處集中時,所有學生走過的路徑之和最短。
第二行也只有乙個整數,表示所有學生走過的路徑之和的最小值。
【資料限制】
所有的資料均隨機生成,且滿足:
30%的資料,1≤n≤200。
60%的資料,1≤n≤3000。
100%的資料,1≤n≤100000。
樹形dp,然後換一下根即可。
#include#include#include#define i int
#define ll long long
#define son t[k]
#define f(i,a,b) for(i i=a;i<=b;i++)
#define n 100005
using namespace std;
i n,m,x,y,z,tot,t[n<<1],nx[n<<1],ls[n],now;
ll ans=1ll<<55,w[n<<1],f[n],sz[n],sum;
char c;
void r(i &x)
while(c>='0'&&c<='9')
x*=p;
}void add(i x,i y,i z)
void dg(i x,i y)
}void get(i x,i y)
for(i k=ls[x];k;k=nx[k]) if(son!=y)
}i main()
dg(1,0);
get(1,0);
printf("%d\n%lld\n",now,ans);
return 0;
}
jzoj1497 景點中心
話說寧波市的中小學生在鎮海中學參加計算機程式設計比賽,比賽之餘,他們在鎮海中學的各個景點參觀。鎮海中學共有n個景點,每個景點均有若干學生正在參觀。這n個景點以自然數1至n編號,每兩個景點的編號均不同。每兩個景點之間有且只有一條路徑。選擇哪個景點集中的學生,才能使所有學生走過的路徑之和最小呢?如果存在...
jzoj1497 景點中心
話說寧波市的中小學生在鎮海中學參加計算機程式設計比賽,比賽之餘,他們在鎮海中學的各個景點參觀。鎮海中學共有n個景點,每個景點均有若干學生正在參觀。這n個景點以自然數1至n編號,每兩個景點的編號均不同。每兩個景點之間有且只有一條路徑。選擇哪個景點集中的學生,才能使所有學生走過的路徑之和最小呢?如果存在...
景點中心 蒟蒻的小題解
話說寧波市的中小學生在鎮海中學參加計算機程式設計比賽,比賽之餘,他們在鎮海中學的各個景點參觀。鎮海中學共有n個景點,每個景點均有若干學生正在參觀。這n個景點以自然數1至n編號,每兩個景點的編號均不同。每兩個景點之間有且只有一條路徑。選擇哪個景點集中的學生,才能使所有學生走過的路徑之和最小呢?如果存在...