終於放寒假了,小明要和女朋友一起去看電影。這天,女朋友想給小明乙個考驗,在小明正準備出發的時候,女朋友告訴他,她在電影院等他,小明過來的路線必須滿足給定的規則:
1、假設小明在的位置是1號點,女朋友在的位置是n號點,則他們之間有n-2個點可以走,小明每次走的時候只能走到比當前所在點編號大的位置;
2、小明來的時候不能按一定的順序經過某些地方。比如,如果女朋友告訴小明不能經過1 -> 2 -> 3,那麼就要求小明來的時候走過的路徑不能包含有1 -> 2 -> 3這部分,但是1 -> 3 或者1 -> 2都是可以的,這樣的限制路徑可能有多條。
這讓小明非常頭痛,現在他把問題交給了你。
特別說明,如果1 2 3這三個點共線,但是小明是直接從1到3然後再從3繼續,那麼此種情況是不認為小明經過了2這個點的。
現在,小明即想走最短的路盡快見到女朋友,又不想打破女朋友的規定,你能幫助小明解決這個問題嗎?
輸入包含多組樣例,每組樣例首先包含兩個整數n和m,其中n代表有n個點,小明在1號點,女朋友在n號點,m代表小明的女朋友有m個要求;接下來n行每行輸入2個整數x 和y(x和y均在int範圍),代表這n個點的位置(點的編號從1到n);
再接著是m個要求,每個要求2行,首先一行是乙個k,表示這個要求和k個點有關,然後是順序給出的k個點編號,代表小明不能走k1 -> k2 -> k3 ……-> ki這個順序的路徑;
n 和 m等於0的時候輸入結束。
[technical specification]
2 <= n <= 50
1 <= m <= 100
2 <= k <= 5
對於每個樣例,如果存在滿足要求的最短路徑,請輸出這個最短路徑,結果保留兩位小數;否則,請輸出」can not be reached!」 (引號不用輸出)。示例1
3 11 12 1
3 12
1 22 1
0 01 1
2 1 2
5 30 0
5 31 2
1 22
5 21
31 2 3
2 4 5
21 5
0 0
2.00can not be reached!
21.65
#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
const double inf = 1e20;
int n;
pairp[100];
double dis(paira,pairb)
double dp[55][1000];
void checkmin(double &a,double b)
struct trie
void init()
void insert(int a,int cnt)
end[now] = 1;
}void build()
while(!q.empty())}}
void solve()
}double ans = inf;
for(int i = 0;i < l;i++)
if(dp[n][i] < inf)
checkmin(ans,dp[n][i]);
if(ans == inf)printf("can not be reached!\n");
else printf("%.2f\n",ans);
}}ac;
int a[10];
int main()
ac.build();
ac.solve();
}return 0;
}
hdu 4511 小明系列故事 女友的考驗
ac自動機上的最短路問題,題目要求所經過結點公升序,且規定某些線路是不合法的,對應於ac自動機上的非法狀態。這道題目大部分題解是用dp來做的,而我是用dijstra變形來解決這個題目的 同上篇文章 做了好幾天的ac自動機的習題,對於ac自動機還是有了一些理解,ac自動機在某個角度來看就是一張有特殊限...
考驗,在真正的考驗來臨之前
前天上午到一客戶處辦理續簽業務,當天下午到一朋友所在公司辦理續簽業務。當時和朋友聊了個把鐘頭。昨天又在網亂逛,結果心有些散了。有一件非常有趣的事情,凡是有朋友聽說我在學佛,都問我還吃不吃肉。在他們的印象裡,好象信佛和修佛法的人不應該吃肉的。我說自己只是進行了皈依還沒有受戒,暫時還是可以吃肉的,盡量不...
人性的考驗
今天是2020 07 08,值得紀念的一天。一次人性的考驗,也是一次人生的選擇。今天老婆給我了50萬,讓我開科創板。以下是我和老婆的對話。雖然錢在我的賬號上,操作是我輕而易舉的事情,因為現在是牛市,我判斷乙個月內有券商 應該是可以給昨天調整的券商帶來至少10 的收益,在開盤30分鐘,我經歷了人性的考...