1497 景點中心

2021-10-09 02:34:05 字數 1415 閱讀 5948

話說寧波市的中小學生在鎮海中學參加計算機程式設計比賽,比賽之餘,他們在鎮海中學的各個景點參觀。鎮海中學共有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編號,每兩個景點的編號均不同。每兩個景點之間有且只有一條路徑。選擇哪個景點集中的學生,才能使所有學生走過的路徑之和最小呢?如果存在...