NOIP2012模擬8 7 找位置

2021-10-24 13:00:25 字數 2013 閱讀 7100

farmer john 想找乙個最好的位置來建新農場,這樣他每天可以少走些路。

fj所在的區域,有n個城鎮(1 <= n <= 10,000)。

城鎮之間,有m(1 <= m <= 50,000)條雙向路相連。

所有城鎮都可以借助一些路相互連線。

fj需要你的幫助來選擇最合適建新農場的城鎮。

k(1 <= k <= 5)個城鎮中有超市,fj每天都會去這些超市。

他計畫每天從新農場出發,訪問包含超市的k個城鎮,然後返回新農場。

fj可以按照任意的順序訪問這些超市。

fj只會在n-k個城鎮中,選擇乙個城鎮來建新農場。因為其他城鎮的房價,比較低一些。

如果他把農場建在最優的位置,而且盡可能明智的選擇行走路線。

請幫fj計算,他每天需要行走的路線長度。

第1行:三個空格隔開的整數,n,m和k。

第2…1+k行:第i+1行包含乙個整數,範圍1…n,表示包含第i個超市的城鎮。

每個超市在不同城鎮。

第2+k…1+k+m行:每行包含三個空格隔開的整數,i,j(1 <= i,j <= n),和l(1 <= l <= 1000), 表示城鎮i和城鎮j之間存在一條長度為l的路。

如果他把農場建在最優的位置,fj每天需要行走的最短路線長度。

5 6 312

31 2 1

1 5 2

3 2 3

3 4 5

4 2 7

4 5 10

fj在5號城鎮建立農場。他每天的行走路線為5-1-2-3-2-1-5,路線長度為12

水題先預處理出每個超市到每個點的距離

因為超市只有5個,全排列列舉便利順序,再列舉農場的位置

#include

#include

#include

#include

#include

#define r register

using

namespace std;

const

int n=

10010

,m=50010

;int n,m,k,last,ans=

0xfffffff

,head[n]

,w[m*2]

,to[m*2]

,next[m*2]

,a[9

],dis[6]

[n],vis[n]

,bj[n]

,b[9];

inline

void

read

(r int

&x)struct node

;struct node

node top()

void

pop()}

}q;inline

void

add(

int x,

int y,

int z)

inline

void

dij(

int x));

while

(true))

;}}void

dfs(

int s)

else

for(r int i=

1;i<=k;

++i)if(

!vis[i]

)vis[i]=1

,b[s]

=i,dfs

(s+1

),vis[i]=0

;}intmain()

memset

(dis,

0x3f

,sizeof dis)

;for

(r int i=

1;i<=k;

++i)

dij(i)

;for

(r int i=

1;i<=k;

++i)vis[i]=0

;dfs(1

);printf

("%d"

,ans)

;}

NOIP2012模擬8 7 奶牛編號

對於這道題,我們先設 放x個,放k個k個 設當前剩下x 個0和k 個1,則對於剩下的位置,我們可以把它抽象成將x 個0插入到x k 個位置中,方案數為 c 因此我們可以先列舉放置的0的個數,當總方案數 geqslant n時,那麼我們要求的答案長度便求了出來 於是我們可以暴力列舉了 即使我們知道了答...

NOIP2012模擬10 25 旅行

給定乙個n行m列的字元矩陣,代表空地,x 代表障礙。移動的規則是 每秒鐘以上下左右四個方向之一移動一格,不能進入障礙。計算 在空地中隨機選擇起點和終點 可以重合,此時最短耗時為0 從起點移動到終點最短耗時的平均值。每一行每一列至多有1個障礙,並且障礙不在對角線方向相鄰。以下矩陣是不合法的 x x.第...

NOIP2012模擬10 25 剪草

首先分析的出兩個結論,1 每棵草最多隻剪一次 2 按照生長速度,先剪小的,再剪大的。不難證明,略。那麼把小草按生長速度從大到小排個序後,設f i,j 表示,在倒數第i個時刻,已經處理了j棵草時的最小高度和。轉移為f i j min f i j 1 f i 1 j 1 a j g a ns i 1 a...