負環 單詞環(01分數規劃,結論)

2021-10-02 08:49:38 字數 1859 閱讀 7649

我們有 n 個字串,每個字串都是由 a∼z 的小寫英文本母組成的。

如果字串 a 的結尾兩個字元剛好與字串 b 的開頭兩個字元相匹配,那麼我們稱 a 與 b 能夠相連(注意:a 能與 b 相連不代表 b 能與 a 相連)。

我們希望從給定的字串中找出一些,使得它們首尾相連形成乙個環串(乙個串首尾相連也算),我們想要使這個環串的平均長度最大。

如下例:

ababc

bckjaca

caahoynaab

第乙個串能與第二個串相連,第二個串能與第三個串相連,第三個串能與第乙個串相連,我們按照此順序相連,便形成了乙個環串,長度為 5+7+10=22(重複部分算兩次),總共使用了 3 個串,所以平均長度是 223≈7.33。

輸入格式

本題有多組資料。

每組資料的第一行,乙個整數 n,表示字串數量;

接下來 n 行,每行乙個長度小於等於 1000 的字串。

讀入以 n=0 結束。

輸出格式

若不存在環串,輸出」no solution」,否則輸出最長的環串的平均長度。

只要答案與標準答案的差不超過 0.01,就視為答案正確。

資料範圍

1 ≤n

≤105

1≤n≤105

1≤n≤10

5輸入樣例:

3intercommunicational

alkylbenzenesulfonate

tetraiodophenolphthalein

0輸出樣例:

21.66

先說結論叭,當進入了大於2n次的時候(或者一直進乙個環那麼大概率是存在負環)

其次就是建圖的事了。我們首先可以考慮的是每個單詞連線一條邊,那麼我們最後兩個單詞組合有576種可能,如果所有單詞都一樣有100000條邊,100000個點。這顯然是爆掉的。因為我們只考慮開頭兩個單詞和結尾兩個單詞,所以我們把乙個單詞拆成兩個點,邊權是單詞長度。這樣的話我們點數就降到了576個點,100000條邊了,加上定理優化是可以接受的。接下來就是01分數規劃的問題,這裡就不化簡演示了,化簡和上一題一模一樣可以去看看,只不過是將點權加到邊權上的時候點權是1而已。然後我們答案肯定是0到1000,左開右閉。根據表示式:邊權之和-mid點權之和》0,當我們m等於0的時候左邊表示式最大,如果這個時候都小於等於0則無解。

#include

using

namespace std;

const

int n=

700;

const

int m=

1e7+7;

int ne[m]

,e[m]

,w[m]

,head[m]

,cnt,vis[n]

,con[n]

;int n;

double dis[n]

;void

add(

int a,

int b,

int c)

bool

spfa

(double mid)

int count=0;

while

(!q.

empty()

)}}}

return0;

}int

main()

; cnt=0;

memset

(head,-1

,sizeof head)

;for

(int i=

1;i<=n;i++)if

(!spfa(0

))puts

("no solution");

else

cout<}

jzoj3852 單詞接龍 0 1分數規劃,負環

n nn個單詞串,頭尾有兩個相同單詞就可以連在一起,求乙個最長的環使得平均單詞長度最長。其實總共26 26 26 26 26 2 6個點,然後求乙個迴路使得平均邊長最長 就是0 1分數規劃問題 二分乙個答案mid midmi d,將邊權改為mid w mid w mid w,然後跑負環判斷即可。in...

0 1分數規劃

題目鏈結 中文鏈結 附一篇大佬部落格感覺講的不錯 0 1分數規劃,不妨設 l a i b i 題目要求要讓結果最大,那麼就是l最大最終移相化簡可得 a i l b i 0,因為a 和b都是已知所以我們可以直接列舉l,當我們所求的值大於零說明l還有更優解當小於零時l沒有最優解。直接二分即可 inclu...

01分數規劃

01分數規劃,就是這樣乙個東西 max frac 其中 xi in 簡而言之,就是在n個物品中選出任意幾個 或者可以有限制選多少個 使得其兩種權值a,b的比值最大 這樣的問題可以二分解決 假如有這樣一道裸題 poj2976,選n k個物品使得比值最大 我們二分出r,若存在 frac r 則r可行 變...