一共兩種解法,所以即便你不會最短路,也可以做,甚至爆搜+剪枝的時間和空間消耗小於最短路做法。
題意:
小明現在要追討一筆債務,已知有n座城市,每個城市都有編號,城市與城市之間存在道路相連(每條道路都是雙向的),經過任意一條道路需要支付費用。小明一開始位於編號為1的城市,欠債人位於編號為n的城市。小明每次從乙個城市到達另乙個城市需要耗時1天,而欠債人每天都會揮霍一定的錢,等到第k天後(即第k+1天)他就會離開城n並再也找不到了。小明必須要在他離開前抓到他(最開始為第0天),同時希望自己的行程花費和欠債人揮霍的錢的總和最小,你能幫他計算一下最小總和嗎?
題解:
dij的乙個變式題,只需要,雖然這只是乙個變式題,但我還真沒想出來,看了題解才會的。。。
只需要把visited和dis這兩個陣列多開出一維空間來維護一下第幾天走到的哪個點即可。
最後遍歷一邊 1到k天,所有dis[n]的值,取最小的即可。
**:
/*keep on going never give up*/
#pragma gcc optimize(3,"ofast","inline")
#include
#define endl '\n'
#define ios std::ios::sync_with_stdio(false),cin.tie(0), cout.tie(0);
//#define int long long
const
int maxn =
2e4+10;
const
int maxn =
0x3f3f3f3f
;const
int minn =
0xc0c0c00c
;typedef
long
long ll;
const
int mod =
1e9+7;
using
namespace std;
bool visited[
1010][
1010];
struct wazxyedge[maxn]
;int head[maxn]
,dis[
1010][
1010
],cnt=1;
int n,m,k;
int p[maxn]
;inline
void
add(
int u,
int v,
int w)
struct node
bool
operator
<
(const node & a)
const};
void
dij()}
}}intmain()
for(
int i=
1;i<=k;i++
)memset
(visited,
false
,sizeof visited)
;memset
(dis,maxn,
sizeof dis)
;dij()
;int ans=maxn;
for(
int i=
1;i<=k;i++)if
(ans==maxn) cout<
;else cout<
return0;
}
上面是爆搜+剪枝
下面是正解
爆搜加剪枝你值得擁有。
if
(sum>=ans)
return;if
(sum>=ans)
return;if
(sum>=ans)
return
;
對加了這句話,就ok了。
爆搜的**也不需要多解釋了,今天突然想起來剪枝一下好像可以就試了試。
其實就是dfs暴力所有路徑。。。加了乙個再普通不過的剪枝。
**:
/*keep on going never give up*/
#pragma gcc optimize(3,"ofast","inline")
#include
#define endl '\n'
#define ios std::ios::sync_with_stdio(false),cin.tie(0), cout.tie(0);
//#define int long long
const
int maxn =
2e4+10;
const
int maxn =
0x3f3f3f3f
;const
int minn =
0xc0c0c00c
;typedef
long
long ll;
const
int mod =
1e9+7;
using
namespace std;
bool visited[
1010];
struct wazxyedge[maxn]
;int head[maxn]
,cnt=1;
int n,m,k;
int p[maxn]
,ans;
inline
void
add(
int u,
int v,
int w)
void
dfs(
int x,
int sum,
int d)
if(sum>=ans)
return;if
(d>k-1)
return
;for
(int i=head[x]
;i;i=edge[i]
.next)}}
intmain()
for(
int i=
0;i)memset
(visited,
false
,sizeof visited)
; ans=maxn;
dfs(1,
0,0)
;if(ans==maxn) cout<
;else cout<
return0;
}
牛客網 兩種排序方法
解題思路 思路很簡單,將接受的字串都放到vector容器中,利用string的operator 運算子過載來按ascii比較字串,利用string的size來比較字串的長度.根據字典排序即根據阿斯克嗎值排序 include include include using namespace std 長度...
Bacon Number 兩種解法
view code 題目 cid 567 題目分析 與longth way 類似 這個好象就是傳說中的六度人脈,你只要通過六度人脈就可以找到世界上的任何乙個人。假設乙個人一生會認識n個人,那n n 1 n 2 n 3 n 4 n 5 n 6 世界總人數。給定一些邊確定乙個圖,即給定一些點之間的連通情...
The Longest Path 兩種解法
view code 題目 cid 567 題目分析 給定一些邊確定乙個圖,即給定一些點之間的連通情況,保證給定的圖沒有迴路,要求輸出該圖存在的最長路徑。思路分析 根據給定資訊構造圖,用鄰接表表示。鄰接矩陣明顯很麻煩且效率不高 將每乙個頂點看成是樹根,求出樹的高度。得到一系列樹的高度,最大的那個就是圖...