2596 售貨員的難題

2022-05-03 11:48:26 字數 1941 閱讀 3780

時間限制: 1 s

空間限制: 32000 kb

題目等級 : 鑽石 diamond

題解某鄉有n個村莊(1輸入描述 input description

村莊數n和各村之間的路程(均是整數)

輸出描述 output description

最短的路程

樣例輸入 sample input

0 2 1

1 0 2

2 1 0

樣例輸出 sample output

資料範圍及提示 data size & hint

本題可用最短路思想、搜尋來解決,但是可能無法通過一組極限資料(且效率較低)。建議按樹狀dp考慮!

分類標籤 tags 點此展開 

動態規劃

最小生成樹

圖論ac**1:

/*

不會什麼樹形dp,我做的是spfa(其實floyed就可以)+深搜+剪枝

首先將邊反向,spfa處理所有點到1的距離,以備剪枝使用

然後深搜得到答案

剪枝:利用spfa得到的距離,當當前的dis+(n-t)*minn+f[x]>ans時,剪枝

(minn是矩陣中的最短距離,n-t是還有幾步可以遍歷完所有的村莊)

*/#include

#include

#include

#include

#define m 20

#define inf 3000000

using

namespace

std;

int map[m][m],f[m],n,ans=inf,min1=inf;

inta2[m][m];

bool

vis[m];

queue

q;intread()

while(c>='

0'&&c<='9')

return num*flag;

}void dfs(int x,int t,int

dis)

for(int i=1;i<=n;i++)

if(!vis[i])

}void

spfa()}}

}int

main()

spfa();

memset(vis,

0,sizeof

(vis));

vis[

1]=1

; dfs(

1,1,0

); printf("%d

",ans);

return0;

}

ac**2:

#include#include

using

namespace

std;

#define n 51

int n,tr[n][n],m=0x7fffffff

;bool

vis[n];

void run(int p,int d,int

s)

for(r=1;r<=n;r++)

}

}

intmain()

ac**3:

#include#include

#include

using

namespace

std;

int f[20],map[16*16][16*16

];int n,a,b,c,sum=0x7f7f7f7f

;void dfs(int s ,int dis,int

k)

for(int i=1;i<=n;i++)

}}int

main()

2596 售貨員的難題

時間限制 1 s 空間限制 32000 kb 題目等級 鑽石 diamond 某鄉有n個村莊 1輸入描述 input description 村莊數n和各村之間的路程 均是整數 輸出描述 output description 最短的路程 樣例輸入 sample input 0 2 1 1 0 2 2...

售貨員的難題(codevs 2596)

題目描述 description 某鄉有n個村莊 1輸入描述 input description 村莊數n和各村之間的路程 均是整數 輸出描述 output description 最短的路程 樣例輸入 sample input 0 2 1 1 0 2 2 1 0 樣例輸出 sample outpu...

售貨員的難題

售貨員的難題 5000 ms 65535 kb 675 3441 tags 動態規劃 某鄉有n個村莊 1 n 20 有乙個售貨員,他要到各個村莊去售貨,各村莊之間的路程s 0 s 1000 是已知的,且a村到b村與b村到a村的路大多不同。為了提高效率,他從商店出發到每個村莊一次,然後返回商店所在的村...