锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
]]>
———————————————————————————————————————————————————
銆愯儗鏅紙紲炵妵涓嶈鍥ц錛?x錛夈?br />鏈矙鑼舵渶榪戝紑濮嬬寷鏀繪悳绱€佽繎浼箋侀殢鏈虹瓑綆楁硶錛岀洰鏍囨槸A鎺堿HOI2012鐨勫悗3棰橈紙鍦ㄥ摢璺屽掑氨浠庡摢鐖搗錛夈傛槰澶╂櫄涓婃壘鍒拌繖棰橈紝鍙戠幇鏄悳绱紝浜庢槸寮濮嬫崏……緇撴灉琚姌鑵句簡(jiǎn)涓鏅氫笂鍔犱竴涓婂崍鎵岮鎺夛紝涓嶈繃錛岀湅鍦ㄨ繖棰樺彲浠ョ郴緇熸х殑鍙嶆槧DFS浼樺寲鐨勪竴鑸楠わ紝蹇嶄簡(jiǎn)……鍙﹀錛岃繖棰樻槸鏈矙鑼跺湪RQNOJ涓婇氳繃鐨勭400棰?#8230;…鍥炴兂璧烽氳繃絎?00棰樼殑鏃跺欏凡緇忔槸榪戜笁騫村崐涔嬪墠浜?#8230;…鐪熼搴熷晩……
———————————————————————————————————————————————————
鏅欴FS錛堜笉鍔犺凱浠o級(jí)鐨勪紭鍖栨柟娉曚富瑕佹湁錛?br />錛?錛夊彲琛屾у壀鏋濓紝濡傛灉閬囧埌宸茬粡鏃犳硶浜х敓鍙瑙g殑鎯呭喌灝卞壀鏋濓紝鏈夋椂鍊欙紝鍙鎬у壀鏋濅篃鍙互鎸囧湪鎼滅儲(chǔ)榪囩▼涓涓嶅悎娉曟儏鍐電殑鍓旈櫎錛?br />錛?錛夋渶浼樻у壀鏋濓細(xì)濡傛灉閬囧埌宸茬粡鏃犳硶浜х敓姣旂洰鍓嶅緱鍒扮殑鏈浼樿В榪樿浼樼殑瑙g殑鎯呭喌灝卞壀鏋濓紝榪欏叾涓寘鎷惎鍙戝紡鏈浼樻у壀鏋濓紙鍗沖垎鏀檺鐣岋級(jí)錛屽鐩墠瑙g殑榪涘睍鎯呭喌浣滀箰瑙備及璁★紝濡傛灉浼拌鍊奸兘涓嶈兘瓚呰秺鐩墠鐨勬渶浼樿В錛屽垯鍓灊錛?br />錛?錛夐氳繃鏀瑰彉鎼滅儲(chǔ)欏哄簭錛屽敖鏃╁緱鍑鴻緝浼樿В錛屼粠鑰屼負(fù)鍚庨潰鐨勫壀鏋濇彁渚涗綑鍦幫紱
錛?錛夐氳繃棰勫鐞嗙瓑鎵嬫錛屾彁鍓嶅緱鍒板惎鍙戝兼垨鑰呰緝浼樿В錛屼負(fù)鍚庨潰鐨勫壀鏋濇彁渚涗綑鍦幫紱
涓鑸楠わ細(xì)
錛?錛夐澶勭悊錛屽綋鐒舵槸鍐欏湪鏈鍓嶉潰錛屽湪鎼滅儲(chǔ)鍓嶅緱鍒板惎鍙戝肩瓑涓滀笢錛?br />錛?錛夋悳绱㈣繃紼嬩腑錛屽厛鍐欐渶浼樻у壀鏋濓紙鍖呮嫭宸茬粡鍒拌揪鎼滅儲(chǔ)緇堢偣浜?jiǎn)锛屼篃搴旇鍒ゆ柇涓涓嬶紝鎻愬墠鎺掗櫎涓嶆槸鏈浼樿В鐨勬儏鍐碉級(jí)錛?br />錛?錛夊啀鍒ゅ畾鎼滅儲(chǔ)緇堢偣錛屽鏋滃埌浜?jiǎn)锛屼篃涓嶈椹笂鏇存柊瑙eQ岃屾槸瑕佸垽瀹氳繖涓В鏄惁絎﹀悎瑕佹眰錛屽啀鏇存柊錛?br />錛?錛夎嫢鏈埌緇堢偣錛屽啀鍐欏彲琛屾у壀鏋濓紱
錛?錛夋渶鍚庡啓鎼滅儲(chǔ)榪囩▼錛屽寘鎷渶瑕佹敼鍙樻悳绱㈤『搴忕殑鎯呭喌銆?br />
娉ㄦ剰浜嬮」錛?span style="color: red">鏁扮粍鐨勫垎灞傞棶棰樸?/strong>
榪欐槸涓涓緢涓ラ噸鐨勯棶棰橈紝鍥犱負(fù)鍒嗗眰鍑洪敊寰堝彲鑳戒細(xì)瀵艱嚧涓浜涘緢鎬殑閿欒鍑虹幇錛岄毦浠ュ彂鐜般傚湪鎼滅儲(chǔ)棰樼殑璋冭瘯鎶宸?/a>榪欎竴綃囦腑錛屽凡緇忔彁鍒頒簡(jiǎn)榪欎釜闂錛屾湰棰樺張娑夊強(qiáng)鍒頒簡(jiǎn)銆?br />涓鑸潵璇達(dá)紝鎼滅儲(chǔ)榪囩▼涓嬌鐢ㄧ殑鏁扮粍錛堝寘鎷彉閲忥紝鍙互瑙嗕負(fù)闆剁淮鏁扮粍錛夊彲浠ュ垎涓轟互涓嬩笁綾伙細(xì)
錛?錛夊湪鎼滅儲(chǔ)榪囩▼涓紝鍙細(xì)寮曠敤鍏跺鹼紝涓嶄細(xì)淇敼鐨勬暟緇勶紙姣斿棰勫鐞嗕腑寰楀埌鐨勯偅浜涗笢涓滐級(jí)錛岀浉褰撲簬甯擱噺錛?br />錛?錛夊湪鎼滅儲(chǔ)榪囩▼涓紝浼?xì)鏀瑰彉鍏跺鹼紝浣嗗湪鎼滅儲(chǔ)瀹屾瘯鍚庤兘鏀瑰洖鍘熷肩殑鏁扮粍錛?br />錛?錛夊湪鎼滅儲(chǔ)榪囩▼涓紝浼?xì)鏀瑰彉鍏跺鹼紝涓斿湪鎼滅儲(chǔ)瀹屾瘯鍚庝篃鏀逛笉鍥炲師鍊肩殑鏁扮粍銆?br />瀵逛簬錛?錛夛紙2錛夌被鏁扮粍錛屼笉闇鍒嗗眰錛屼絾瀵逛簬絎紙3錛夌被鏁扮粍涓瀹氳鍒嗗眰銆傝繖鏄洜涓鴻繖浜涙暟緇勫湪澶氬眰鎼滅儲(chǔ)涓兘闇瑕佷慨鏀癸紝鑰屼笖鎼滅儲(chǔ)瀹屼簡(jiǎn)涔熸敼涓嶅洖鏉ワ紝濡傛灉涓嶅垎灞傦紝鍒欏綋鍚庨潰鐨勬悳绱㈠畬姣曚互鍚庯紝瑕佺戶緇悳绱㈠墠闈㈢殑錛屽紩鐢ㄧ殑灝嗘槸鍚庨潰鐨勫鹼紝灝變細(xì)鍑洪敊銆?br />瀵逛簬絎紙3錛夌被鏁扮粍錛屾湁鐨勫凡緇?#8220;鑷劧鍒嗗眰”錛堟瘡灞傛悳绱慨鏀圭殑鍏冪礌閮戒笉涓鏍鳳級(jí)錛屾瘮濡傛湰棰樹唬鐮佷腑鐨凴[][]銆丆[][]銆傜劧鑰屾湁鐨勫茍娌℃湁鑷劧鍒嗗眰錛屾瘮濡傛湰棰樼殑len銆乸os[]銆乼mp[]絳夛紝鍥犳瀵逛簬榪欎簺鏁扮粍錛岄渶瑕佸啀鍔犱竴緇達(dá)紝瀵逛簬涓嶅悓灞備嬌鐢ㄨ緇翠笉鍚岀殑鍏冪礌鍗沖彲銆?br />
涓嬮潰鏄湰棰樼殑綆楁硶錛?br />浣跨敤DFS鎼滅儲(chǔ)姣忎釜浣嶇疆鐨勬尅鏉挎槸鍚﹂渶瑕佹斁銆傛悳绱㈡椂錛屽厛鎼滅珫鐨勫啀鎼滄í鐨勶紝鐢變簬棰樼洰瑕佹眰姣忎釜榪為氬潡閮藉繀欏繪槸鐭╁艦錛屽洜姝ゅ浜庣珫鐨勶紝濡傛灉璇ヤ綅緗殑涓婃柟涓や釜鐩擱偦浣嶇疆鐨勬í鐨勬病鏈夊叏鏀撅紙鍖呮嫭鍙斁浜?jiǎn)涓涓級(jí)錛屽垯璇ヤ綅緗殑绔栫殑鏀句笉鏀懼彇鍐充簬鍏朵笂涓琛屽搴斾綅緗殑绔栫殑鏈夋病鏈夋斁錛堢涓琛岄櫎澶栵級(jí)錛屽鏋滀袱涓í鐨勯兘鏀句簡(jiǎn)錛屽垯榪欓噷鐨勭珫鐨勬棦鍙互鏀句篃鍙互涓嶆斁錛堝厛鎼滀笉鏀劇殑鎯呭喌錛夈傚綋鐒?dòng)灱屼竴琛岀殑涓や釜1涔嬮棿蹇呴』鑷沖皯鏈変竴涓珫鐨勶紝榪欐槸鍙鎬ч檺鍒躲傚湪鎼滄í鐨勭殑鏃跺欙紝鎸夌収璇ヨ鎵鏀劇殑绔栫殑錛屽垎鎴愯嫢騫叉錛屾樉鐒舵瘡涓孌佃涔堜笅闈㈤兘鐢ㄦí鐨勫皝涓婏紝瑕佷箞涓涓兘涓嶅皝涓娿傚叾涓紝濡傛灉璇ユ鎵鍦ㄧ殑榪為氬潡閲岄潰鏈?錛屼笖涓嬩竴琛屽搴斾綅緗篃鏈?錛屽垯蹇呴』灝佷笂錛涜嫢璇ユ鎵鍦ㄨ繛閫氬潡閲岄潰娌℃湁1錛屽垯涓嶈兘灝佷笂錛堝洜涓轟笉鑳芥湁涓涓繛閫氬潡閲屼竴涓?閮芥病鏈夛級(jí)錛屽惁鍒欏彲浠ヨ嚜鐢遍夋嫨灝佽繕鏄笉灝侊紙褰撶劧涔熸槸鍏堟悳涓嶅皝鐨勶級(jí)銆傝繖鏍蜂竴鐩存悳鍒版渶鍚庝竴琛岀殑绔栫殑鍚庯紝榪樿鍒ゆ柇鏈鍚庝竴琛屾湁娌℃湁榪為氬潡閲屾病1錛岃嫢娌℃湁錛屽垯涓轟竴涓彲琛岃В銆傚惎鍙戝紡浼樺寲錛氳D[i]涓虹i琛屽強(qiáng)浠ュ悗鑷沖皯瑕佸嚑涓尅鏉匡紙鑻ユ煇琛屾湁K涓?錛屽垯鑷沖皯闇瑕?K-1)涓珫鐨勶紱鑻ユ煇鍒楁湁K涓?錛屽垯鑷沖皯闇瑕?K-1)涓í鐨勶紝绱姞璧鋒潵鍗沖彲錛屾樉鐒惰繖鏄箰瑙備及璁★級(jí)錛孌[i]鍙互棰勫鐞嗗嚭鏉ワ紝褰撳仛鍚彂鍊箋?br />
浠g爜錛?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
#define re(i, n) for (int i=0; i<n; i++)
#define re1(i, n) for (int i=1; i<=n; i++)
#define re2(i, l, r) for (int i=l; i<r; i++)
#define re3(i, l, r) for (int i=l; i<=r; i++)
#define rre(i, n) for (int i=n-1; i>=0; i--)
#define rre1(i, n) for (int i=n; i>0; i--)
#define rre2(i, r, l) for (int i=r-1; i>=l; i--)
#define rre3(i, r, l) for (int i=r; i>=l; i--)
const int MAXN = 35, INF = ~0U >> 2;
int n, m, D[MAXN], len[MAXN], pos[MAXN][MAXN], tmp[MAXN][MAXN], res = INF;
bool A[MAXN][MAXN], C[MAXN][MAXN], R[MAXN][MAXN], S[MAXN][MAXN][MAXN][MAXN];
void dfs0(int No, int v, int sum, bool FF);
void init()
{
scanf("%d%d", &n, &m); int x;
re(i, n) re(j, m) {scanf("%d", &x); A[i][j] = x;}
}
void prepare()
{
re(i, n) re(j, m) {
S[i][j][i][j] = A[i][j];
re2(k, i+1, n) S[i][j][k][j] = A[k][j] || S[i][j][k - 1][j];
re2(k, j+1, m) S[i][j][i][k] = A[i][k] || S[i][j][i][k - 1];
re2(k, i+1, n) re2(k0, j+1, m) S[i][j][k][k0] = A[k][k0] || S[i][j][k - 1][k0] || S[i][j][k][k0 - 1];
}
int sum;
re(i, n) {
D[i] = 0;
re2(j, i, n) {sum = 0; re(k, m) if (A[j][k]) sum++; if (sum) D[i] += sum - 1;}
re(k, m) {sum = 0; re2(j, i, n) if (A[j][k]) sum++; if (sum) D[i] += sum - 1;}
}
}
void dfs1(int No, int v, int sum)
{
if (sum + D[No + 1] >= res) return;
if (v == len[No] + 1) dfs0(No + 1, 0, sum, 1); else if (tmp[No][v] != 1) dfs1(No, v + 1, sum); else {
int l, r, sum0 = sum;
if (v) l = pos[No][v - 1] + 1; else l = 0;
if (v == len[No]) r = m - 1; else r = pos[No][v];
re3(j, l, r) R[No][j] = 0; dfs1(No, v + 1, sum);
re3(j, l, r) {R[No][j] = 1; sum0++;} dfs1(No, v + 1, sum0);
}
}
void dfs0(int No, int v, int sum, bool FF)
{
if (sum + D[No + 1] >= res) return;
bool FF0; if (A[No][v]) {if (!FF) return; else FF0 = 0;} else FF0 = FF;
if (v == m - 1) {
if (No == n - 1) {
len[No] = 0; re(i, m-1) if (C[No][i]) pos[No][len[No]++] = i;
int l, r, x; bool FFF = 1;
re3(i, 0, len[No]) {
if (i) l = pos[No][i - 1] + 1; else l = 0;
if (i == len[No]) r = m - 1; else r = pos[No][i];
x = 0; rre(j, No) if (R[j][l]) {x = j + 1; break;}
if (!S[x][l][No][r]) {FFF = 0; break;}
}
if (FFF) res = sum;
return;
}
len[No] = 0; re(i, m-1) if (C[No][i]) pos[No][len[No]++] = i;
int l, r, x, sum0 = sum;
re3(i, 0, len[No]) {
if (i) l = pos[No][i - 1] + 1; else l = 0;
if (i == len[No]) r = m - 1; else r = pos[No][i];
x = 0; rre(j, No) if (R[j][l]) {x = j + 1; break;}
if (S[x][l][No][r] && S[No + 1][l][No + 1][r]) {
tmp[No][i] = 2; re3(j, l, r) {sum0++; R[No][j] = 1;}
} else if (S[x][l][No][r]) {
tmp[No][i] = 1; re3(j, l, r) R[No][j] = 0;
} else {
tmp[No][i] = 0; re3(j, l, r) R[No][j] = 0;
}
}
dfs1(No, 0, sum0);
} else if (No && (!R[No - 1][v] || !R[No - 1][v + 1])) {
if (C[No - 1][v]) {C[No][v] = 1; dfs0(No, v + 1, sum + 1, 1);} else {C[No][v] = 0; dfs0(No, v + 1, sum, FF0);}
} else {
C[No][v] = 0; dfs0(No, v + 1, sum, FF0);
C[No][v] = 1; dfs0(No, v + 1, sum + 1, 1);
}
}
void pri()
{
printf("%d\n", res);
}
int main()
{
init();
prepare();
dfs0(0, 0, 0, 1);
pri();
return 0;
}
]]>
姹傚浘鐨剆-t絎琄鐭畝鍗曡礬闂錛岃嫢鏈夐暱搴︾浉鍚岀殑錛屽瓧鍏稿簭灝忕殑浼樺厛銆?br />
棣栧厛錛岀敱浜庢槸綆鍗曡礬錛屾墍浠?a title="A*" href="http://www.shnenglu.com/MatoNo1/archive/2011/05/01/145456.html">A*鏄笉鑳藉仛鐨勶紝鍥犱負(fù)鏈夊彲鑳芥湁涓ゆ潯s-i錛坕涓烘煇涓腑闂寸偣錛夎礬P1鍜孭2錛孭1姣擯2鐭紝浣嗙敱浜嶱1鍒拌揪鐨勯《鐐逛笌P2涓嶅悓錛屽鑷存渶緇堟部P1鍒拌揪t鐨勮礬寰勯暱搴﹂暱浜庢部P2鍒拌揪t鐨勶紙鐢氳嚦鏈夊彲鑳芥部P1鏍規(guī)湰鍒頒笉浜?jiǎn)t錛夈傜劧鍚庯紝濡傛灉鐩存帴鐢―FS錛岀敱浜庤姹傜殑鏄K浼樿В錛岃屼笉鏄渶浼樿В錛屾墍浠ヤ笉鑳戒嬌鐢ㄦ渶浼樻у壀鏋濓紙鍖呮嫭鍒嗘敮闄愮晫錛夛紝鍥犳涓撻棬涓烘渶浼樻у壀鏋濇湇鍔$殑“鏀瑰彉鎼滅儲(chǔ)欏哄簭”鎶宸т篃涓嶈兘浣跨敤浜?jiǎn)锛屽洜姝ゅQ岃兘澶熶嬌鐢ㄧ殑鍙湁鍙鎬у壀鏋濓紝鑰屾湰棰樼殑鏁版嵁鑼冨洿浣垮緱榪欑綆楁硶蹇呯劧TLE銆?br />
姝hВ鏄竴縐嶇敱榪唬鍔犳繁鎬濇兂鎵╁睍寰楀埌鐨?#8220;榪唬鍙樹紭”DFS銆傝緗竴涓礬寰勯暱搴︿笂闄怹錛屾悳绱鍒皌鐨勬墍鏈夌畝鍗曡礬錛屽湪鎼滅儲(chǔ)榪囩▼涓紝閬囧埌闀垮害澶т簬Z鐨勮礬寰勫氨鍋滄錛堝壀鏋濓級(jí)錛岀劧鍚庯紝鑻ュ緱鍒拌礬寰勪笉瓚矺鏉★紝鍒欏鍔燴鐨勫鹼紝閲嶆柊寮濮嬫悳绱紝鐩村埌寰楀埌鐨勮礬寰勬繪暟澶т簬絳変簬K鏉′負(fù)姝€傝繖閲屽彲浠ヨ繘琛屽惎鍙戝紡鐨勪紭鍖栵紝璁緂[i]涓虹偣i鍒皌鐨勬渶鐭礬闀垮害錛屽垯鎼滅儲(chǔ)榪囩▼涓紝鍋囪鐩墠鎼滃埌鐐筰錛屽垯錛堢洰鍓嶈礬寰勯暱搴?g[i]錛夋槸瀵規(guī)暣鏉¤礬寰勬渶鐭暱搴︾殑涔愯浼拌錛屽鏋滆繖涓艱秴榪囦簡(jiǎn)Z錛屽氨鍙互鍓灊錛屼絾鍦ㄥ壀鏋濅箣鍓嶈璁頒笅榪欎釜瓚呰繃浜?jiǎn)Z鐨勫惎鍙戝鹼紝鍙栧叾涓渶灝忕殑浣滀負(fù)涓嬩竴嬈¤凱浠g殑Z鍊箋傞偅涔堝浜庡瓧鍏稿簭鑲夸箞鍔烇紵鍙互鍦ㄦ悳绱㈣繃紼嬩腑錛屽己鍒跺厛鎼滅紪鍙峰皬鐨勭粨鐐癸紝榪欐牱寰楀埌鐨剆-t璺緞蹇呯劧鏄瓧鍏稿簭閫掑鐨勩傚彟澶栧彧瑕佹眰鍑虹K鏉¤礬寰勶紝鎼滅儲(chǔ)灝卞彲浠ョ粓姝紝鍥犱負(fù)瀹規(guī)槗璇佹槑錛岄鐩姹傜殑絎琄鐭殑璺緞涓瀹氬凡緇忔眰鍑烘潵浜?jiǎn)锛堝彧涓崢q囦笉涓瀹氭槸鏈鍚庝竴鏉¤屽凡錛夛紝鎵懼埌鍗沖彲銆傛澶栵紝鍦ㄦ悳绱㈣繃紼嬩腑涓嶈蹇樹簡(jiǎn)鍙鎬у壀鏋濓紝灝辨槸濡傛灉娌跨洰鍓嶆悳鍒扮殑璺緞宸茬粡鍒頒笉浜?jiǎn)t浜?jiǎn)锛屽壀鏋濄?br />
“榪唬鍙樹紭”DFS錛屽氨鏄緗竴涓В鐨勮瘎浠峰肩殑涓婇檺錛堟渶灝忓鹼級(jí)鎴栦笅闄愶紙鏈澶у鹼級(jí)錛屽湪鎼滅儲(chǔ)榪囩▼涓紝濡傛灉瀹為檯璇勪環(huán)鍊鹼紙鎴栬呭惎鍙戝鹼紝濡傛灉鍙互鍔犲惎鍙戝紡浼樺寲鐨勮瘽錛夎秺榪囪繖涓檺鍒訛紝鍒欏壀鏋濄傚湪涓嬈℃悳绱㈠悗錛屽鏋滄病鏈夊緱鍒扮鍚堣姹傜殑瑙o紝灝卞皢璇ラ檺鍒跺?span style="color: red">璁句負(fù)鏈鎼滅儲(chǔ)榪囩▼涓秺鐣?#8220;瓚?#8221;寰楁渶榪戠殑閭d釜鍊?/strong>錛岄噸鏂板紑濮嬫悳绱紝鐩村埌鎵懼埌鎵闇瑕佺殑瑙f垨鑰?span style="color: red">鍙戠幇鏃犺В錛堝鏋滀竴嬈℃悳绱腑娌℃湁鍙戠敓瓚婄晫錛屽嵈浠嶇劧娌℃湁鎵懼埌瑙o級(jí)涓烘銆傚叾搴旂敤涓昏浣撶幇鍦ㄤ袱涓柟闈細(xì)錛?錛夋悳绱㈡爲(wèi)榪囨繁鐢氳嚦鏃犻檺娣憋紝浣嗘墍闇姹傜殑閭d釜瑙e嵈涓嶆繁鐨勬儏鍐碉紱錛?錛夋眰絎琄浼樿В鐨勬儏鍐點(diǎn)?br />
浠g爜錛?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define re(i, n) for (int i=0; i<n; i++)
#define re1(i, n) for (int i=1; i<=n; i++)
#define re2(i, l, r) for (int i=l; i<r; i++)
#define re3(i, l, r) for (int i=l; i<=r; i++)
#define rre(i, n) for (int i=n-1; i>=0; i--)
#define rre1(i, n) for (int i=n; i>0; i--)
#define rre2(i, r, l) for (int i=r-1; i>=l; i--)
#define rre3(i, r, l) for (int i=r; i>=l; i--)
const int MAXN = 51, MAXK = 201, MAXM = 3000, INF = ~0U >> 2;
struct edge {
int a, b, w, pre, next;
} E[MAXM + MAXN], E0[MAXM + MAXN];
struct edge0 {
int a, b, w;
bool operator< (edge0 e0) const {return b < e0.b;}
} _E[MAXM];
int n, m, s, t, K, dist[MAXN], Q[MAXN + 1];
int Z, Z0, vst0[MAXN], _FL, len0, X00[MAXN], No, len[MAXK], X0[MAXK][MAXN], sum0[MAXK], reslen, res[MAXN];
bool vst[MAXN], res_ex = 0;
void init_d()
{
re(i, n) E[i].pre = E[i].next = E0[i].pre = E0[i].next = i; m = n;
}
void add_edge(int a, int b, int w)
{
E[m].a = a; E[m].b = b; E[m].w = w; E[m].pre = E[a].pre; E[m].next = a; E[a].pre = m; E[E[m].pre].next = m;
E0[m].a = b; E0[m].b = a; E0[m].w = w; E0[m].pre = E0[b].pre; E0[m].next = b; E0[b].pre = m; E0[E0[m].pre].next = m++;
}
void init()
{
int m0; scanf("%d%d%d%d%d", &n, &m0, &K, &s, &t); init_d(); s--; t--;
re(i, m0) {scanf("%d%d%d", &_E[i].a, &_E[i].b, &_E[i].w); _E[i].a--; _E[i].b--;}
sort(_E, _E + m0);
re(i, m0) add_edge(_E[i].a, _E[i].b, _E[i].w);
}
void prepare()
{
re(i, n) {vst[i] = 0; dist[i] = INF;} vst[t] = 1; dist[t] = 0; Q[0] = t;
int x, y, d0, d1;
for (int front=0, rear=0; !(!front && rear==n || front==rear+1); front==n ? front=0 : front++) {
x = Q[front]; d0 = dist[x];
for (int p=E0[x].next; p != x; p=E0[p].next) {
y = E0[p].b; d1 = d0 + E0[p].w;
if (d1 < dist[y]) {
dist[y] = d1;
if (!vst[y]) {vst[y] = 1; Q[rear==n ? rear=0 : ++rear] = y;}
}
}
vst[x] = 0;
}
}
void dfs(int x, int sum)
{
if (x == t) {
if (sum <= Z) {sum0[No] = sum; len[No] = len0; re(i, len0) X0[No][i] = X00[i]; No++; if (No == K) res_ex = 1;}
else if (sum < Z0) Z0 = sum;
return;
} else {
int h0 = sum + dist[x];
if (h0 > Z) {if (h0 < Z0) Z0 = h0; return;}
vst0[x] = ++_FL; Q[0] = x; int _x, _y;
for (int front=0, rear=0; front<=rear; front++) {
_x = Q[front];
for (int p=E[_x].next; p != _x; p=E[p].next) {
_y = E[p].b;
if (!vst[_y] && vst0[_y] != _FL) {vst0[_y] = _FL; Q[++rear] = _y;}
}
}
if (vst0[t] != _FL) return;
for (int p=E[x].next; p != x; p=E[p].next) {
_y = E[p].b;
if (!vst[_y]) {vst[_y] = 1; X00[len0++] = _y; dfs(_y, sum + E[p].w); if (res_ex) return; else {len0--; vst[_y] = 0;}}
}
}
}
void solve()
{
Z = dist[s]; int No0 = 0; _FL = 0;
while (1) {
Z0 = INF; No = 0; re(i, n) {vst[i] = 0; vst0[i] = 0;}
vst[s] = 1; len0 = 1; X00[0] = s; dfs(s, 0);
if (res_ex) {
No0 = K - No0;
re(i, K) if (sum0[i] == Z) {No0--; if (!No0) {reslen = len[i]; re(j, len[i]) res[j] = X0[i][j];}}
break;
} else if (Z0 == INF) break; else {No0 = No; Z = Z0;}
}
}
void pri()
{
if (res_ex) {
printf("%d", res[0] + 1);
re2(i, 1, reslen) printf("-%d", res[i] + 1);
puts("");
} else puts("No");
}
int main()
{
init();
prepare();
solve();
pri();
return 0;
}
]]>
]]>
]]>
鍦ㄩ噸澶嶈鐩栭棶棰樹腑錛屽垹鍘諱竴鏁村垪鐨勬搷浣滐紙delcol錛夋槸鏂紑璇ュ垪闄や簡(jiǎn)鍒濆緇撶偣澶栫殑鎵鏈夌粨鐐圭殑宸﹀彸閾撅紙delLR錛夛紝榪欐牱錛屽鏋滄湁涓浜涜棰勫厛宸茶閫変腑錛屽垯鍒犲幓榪欎竴琛岋紙鍑嗙‘鏉ヨ鏄榪欎竴琛屾墍鏈夌粨鐐規(guī)墽琛宒elcol鎿嶄綔錛夛紝榪欐椂灝變細(xì)鍑虹幇闂錛屽洜涓哄湪鍒犲幓榪欎竴琛岀殑鏈鍚庝竴涓粨鐐圭殑鏃跺欙紝鍏跺乏銆佸彸閾鵑兘鎸囧悜鍏舵湰韜紝姝ゆ椂灝辨棤娉曞垹鎺夎繖涓粨鐐廣傝В鍐寵繖涓闂鐨勫姙娉曟槸闄や簡(jiǎn)鍦ㄧ煩闃典腑寮曞叆鍒楀ご浠ュ錛岃繕瑕佸紩鍏ヨ澶達(dá)紙rowh錛夛紝騫朵笖淇濊瘉琛屽ご涓嶅垹鎺夈傝繖鏍峰湪鍒犳帀涓鏁磋鐨勬椂鍊欏氨涓嶄細(xì)鍑洪棶棰樹簡(jiǎn)銆備絾鏄紝濡傛灉榪欐牱鐨勮瘽錛岄渶瑕佸湪鎼滅儲(chǔ)榪囩▼涓墽琛宒elcol鎿嶄綔鍓嶈繘琛岀壒鍒わ紝淇濊瘉涓嶅垹鎺夎澶寸粨鐐癸紙姣斿灝嗚澶寸粨鐐圭殑U銆丏鍩熺疆涓?1錛夛紝騫朵笖錛屽湪姹傚惎鍙戝嚱鏁癶()鍊肩殑鏃跺欎篃瑕侀槻姝㈠湪琛屽ご澶勫嚭鐜伴棶棰橈紝鍙互灝嗚澶寸粨鐐圭殑琛屽垪鍙峰潎緗負(fù)0銆?br />
鑰屽湪綺劇‘瑕嗙洊闂涓紝鍒犲幓涓鏁村垪鐨勬搷浣滄槸鏂紑緇撶偣鐨勪笂涓嬮摼鑰屼笉鏄乏鍙抽摼錛屽洜姝ゅ湪鍒犲幓涓鏁磋鏃跺氨涓嶉渶瑕佸紩鍏ヨ澶寸粨鐐廣?br />
涓嬮潰鏄疨KU1084鐨凙C浠g爜錛?
#include <stdio.h>
using namespace std;
#define re(i, n) for (int i=0; i<n; i++)
#define re1(i, n) for (int i=1; i<=n; i++)
#define re3(i, l, r) for (int i=l; i<=r; i++)
const int MAXN = 60, MAXM = 55, INF = ~0U >> 2;
struct dlnode {
int r, c, U, D, L, R;
} d[(MAXN + 1) * (MAXM + 1)];
int _n, n, m, nodes, rowh[MAXN + 1], cols[MAXM + 1], B[5][5][4], res;
bool A[MAXN + 1], vst[MAXN];
void init_d()
{
re3(i, 0, m) {d[i].U = d[i].D = i; d[i].L = i - 1; d[i].R = i + 1;} d[0].L = m; d[m].R = 0;
nodes = m; re1(i, n) {rowh[i] = ++nodes; d[nodes].L = d[nodes].R = nodes; d[nodes].U = d[nodes].D = -1;}
re1(i, m) cols[i] = 0;
}
void add_node(int r, int c)
{
cols[c]++; d[++nodes].r = r; d[nodes].c = c;
d[nodes].U = d[c].U; d[nodes].D = c; d[c].U = nodes; d[d[nodes].U].D = nodes;
int rh = rowh[r]; d[nodes].L = d[rh].L; d[nodes].R = rh; d[rh].L = nodes; d[d[nodes].L].R = nodes;
}
void delLR(int x)
{
d[d[x].L].R = d[x].R; d[d[x].R].L = d[x].L;
}
void delUD(int x)
{
d[d[x].U].D = d[x].D; d[d[x].D].U = d[x].U;
}
void resuLR(int x)
{
d[d[x].L].R = d[d[x].R].L = x;
}
void resuUD(int x)
{
d[d[x].U].D = d[d[x].D].U = x;
}
void delcol(int x)
{
for (int i=d[x].D; i != x; i=d[i].D) delLR(i);
}
void resucol(int x)
{
for (int i=d[x].U; i != x; i=d[i].U) resuLR(i);
}
void prepare()
{
int x = 0;
re(i, _n) {
re(j, _n) {B[i][j][0] = ++x; B[i][j][1] = x + _n; B[i][j][2] = x + _n + 1; B[i][j][3] = x + _n + _n + 1;}
x += _n + 1;
}
x = 0;
re(i, _n) re(j, _n - i) re(k, _n - i) {
x++;
re(t, i+1) {
add_node(B[j][k + t][0], x);
add_node(B[j + t][k][1], x);
add_node(B[j + t][k + i][2], x);
add_node(B[j + i][k + t][3], x);
}
}
int rh;
re1(i, n) if (A[i]) {
rh = rowh[i];
for (int j=d[rh].R; j != rh; j=d[j].R) delcol(j);
}
res = n;
}
int h()
{
re1(i, m) vst[i] = 0;
int z = 0;
for (int i=d[0].R; i; i=d[i].R) if (!vst[i]) {z++; vst[i] = 1; for (int j=d[i].D; j != i; j=d[j].D) for (int k=d[j].R; k != j; k=d[k].R) vst[d[k].c] = 1;}
return z;
}
void dfs(int dep)
{
int h0 = h(); if (dep + h0 >= res) return; else if (!h0) {res = dep; return;}
int mins = INF, c0; for (int i=d[0].R; i; i=d[i].R) if (!cols[i]) return; else if (cols[i] < mins) {mins = cols[i]; c0 = i;}
for (int i=d[c0].D; i != c0; i=d[i].D) {
delcol(i); for (int j=d[i].R; j != i; j=d[j].R) if (d[j].U != -1) delcol(j);
dfs(dep + 1);
for (int j=d[i].L; j != i; j=d[j].L) if (d[j].U != -1) resucol(j); resucol(i);
}
}
int main()
{
int tests, _n0, x;
scanf("%d", &tests);
re(testno, tests) {
scanf("%d%d", &_n, &_n0);
n = _n * (_n + 1) << 1; m = 0; re1(i, _n) m += i * i; init_d(); re1(i, n) A[i] = 0;
re(i, _n0) {scanf("%d", &x); A[x] = 1;}
prepare();
dfs(0);
printf("%d\n", res);
}
return 0;
}
]]>
娉ㄦ剰錛氭洿鏀硅礬寰勬潯鏁板簲璇ュ湪鍑洪槦鏃舵洿鏀癸紝鑰屼笉鑳藉湪鍏ラ槦鏃舵洿鏀癸紝鍥犱負(fù)鍙兘鍦ㄨ璺緞鍑洪槦涔嬪墠浼?xì)鏈夋柊鐨勬瘮瀹冩洿鐭殑璧\寰勫叆闃熴?br>
浠g爜錛圥KU2449錛夛細(xì)
#include <stdio.h>
#include <queue>
using namespace std;
#define re(i, n) for (int i=0; i<n; i++)
const int MAXN = 1500, MAXM = 150000, INF = ~0U >> 2;
struct edge {
int kk, len, next;
} ed[MAXM], ed2[MAXM];
int n, m, s, t, k_, hd[MAXN], tl[MAXN], hd2[MAXN], tl2[MAXN], h[MAXN], q[MAXN + 1], No[MAXN], res = -1;
bool vst[MAXN];
struct qnode {
int i, g;
};
typedef priority_queue <qnode, vector<qnode> > pq;
pq z;
bool operator< (qnode q1, qnode q2)
{
return q1.g + h[q1.i] > q2.g + h[q2.i];
}
void init()
{
int a0, b0, l0;
scanf("%d%d", &n, &m);
re(i, n) hd[i] = tl[i] = hd2[i] = tl2[i] = -1;
re(i, m) {
scanf("%d%d%d", &a0, &b0, &l0); a0--; b0--;
ed[i].kk = b0; ed[i].len = l0; ed[i].next = -1;
if (hd[a0] == -1) hd[a0] = tl[a0] = i; else tl[a0] = ed[tl[a0]].next = i;
ed2[i].kk = a0; ed2[i].len = l0; ed2[i].next = -1;
if (hd2[b0] == -1) hd2[b0] = tl2[b0] = i; else tl2[b0] = ed2[tl2[b0]].next = i;
}
scanf("%d%d%d", &s, &t, &k_); --s; --t; k_ += s == t;
}
void prepare()
{
re(i, n) {h[i] = INF; vst[i] = 0;} h[t] = 0; vst[t] = 1; q[0] = t;
int i, h0, j, h1;
for (int front=0, rear=0; !(!front && rear == n || front == rear + 1); front == n ? front = 0 : front++) {
i = q[front]; h0 = h[i];
for (int p=hd2[i]; p != -1; p=ed2[p].next) {
j = ed2[p].kk; h1 = h0 + ed2[p].len;
if (h1 < h[j]) {
h[j] = h1;
if (!vst[j]) {vst[j] = 1; if (rear == n) q[rear = 0] = j; else q[++rear] = j;}
}
}
vst[i] = 0;
}
}
void solve()
{
qnode q0; q0.i = s; q0.g = 0; z.push(q0);
re(i, n) No[i] = 0;
int i, d0, j, d1;
while (!z.empty()) {
i = z.top().i; d0 = z.top().g; z.pop();
if (No[i] >= k_) continue;
No[i]++;
if (i == t && No[i] == k_) {res = d0; break;}
for (int p=hd[i]; p != -1; p=ed[p].next) {
j = ed[p].kk; d1 = d0 + ed[p].len;
q0.i = j; q0.g = d1; z.push(q0);
}
}
}
void pri()
{
printf("%d\n", res);
}
int main()
{
init();
prepare();
solve();
pri();
return 0;
}
]]>
錛?錛夊繀欏繪湁鍚彂鍑芥暟浼樺寲錛屽惁鍒橳LE錛?br>錛?錛変笉闇瑕佷簩鍒嗕笅鐣岋紝鍙灝嗙洰鍓峟鍊鹼紙f=g+h錛屽嵆瀹為檯娣卞害鍔犱笂鍚彂鍑芥暟鍊鹼級(jí)涓庣洰鍓嶆眰寰楃殑鏈浼樿В姣旇緝鍗沖彲錛宖>=鏈浼樿В鍗沖壀鏋濓紱
錛?錛夊垹涓鏁村垪錛坉elcol錛夋搷浣滄椂錛屽彲浠ヤ粠浠繪剰涓涓粨鐐瑰紑濮嬪垹錛堜笉涓瀹氳鍚戠簿紜鐩栭偅鏍烽潪瑕佷粠鍒楀ご寮濮嬶級(jí)錛屼絾鏄紝寮濮嬬殑閭d釜緇撶偣涓嶅垹錛佹仮澶嶏紙resucol錛夋椂涔熶笉鎭㈠寮濮嬬殑閭d釜緇撶偣錛佽繖鏄負(fù)浜?jiǎn)鍦ㄦ帴涓嬫潵鐨勬í鍚戦亶鍘嗕腑涓嶅彈濯?jiǎng)鍝嶃傜敱浜庝笉鍒犲紑濮嬬粨鐐癸紝鎵浠ュ湪灝嗘渶浼樺垪鍒犻櫎鏃訛紝闇瑕佸驚鐜竴嬈″垹闄や竴嬈★紝鎭㈠涓嬈°?br>
浠g爜錛氾紙RQNOJ P89錛?/p>
#include <stdio.h>
using namespace std;
#define re(i, n) for (int i=0; i<n; i++)
#define re1(i, n) for (int i=1; i<=n; i++)
#define re3(i, l, r) for (int i=l; i<=r; i++)
const int MAXN = 61, MAXM = 61, INF = ~0U >> 2;
struct DLnode {
int r, c, U, D, L, R;
} d[MAXN * MAXM];
int n, m, nodes, rowh[MAXN], cols[MAXM], res = INF;
void init_d()
{
re3(i, 0, m) {
d[i].r = 0; d[i].c = 0; d[i].U = d[i].D = i; d[i].L = i - 1; d[i].R = i + 1;
}
d[0].L = m; d[m].R = 0;
memset(rowh, 0, n + 1 << 2); memset(cols, 0, m + 1 << 2); nodes = m + 1;
}
void add_node(int r, int c)
{
d[nodes].r = r; d[nodes].c = c; d[nodes].U = d[c].U; d[nodes].D = c; d[c].U = nodes; d[d[nodes].U].D = nodes;
int rh = rowh[r];
if (rh) {
d[nodes].L = d[rh].L; d[nodes].R = rh; d[rh].L = nodes; d[d[nodes].L].R = nodes;
} else d[nodes].L = d[nodes].R = rowh[r] = nodes;
cols[c]++; nodes++;
}
void init()
{
scanf("%d%d", &m, &n);
init_d();
int k, x;
re1(i, n) {
scanf("%d", &k);
re(j, k) {
scanf("%d", &x); add_node(i, x);
}
}
}
void delUD(int x)
{
d[d[x].U].D = d[x].D; d[d[x].D].U = d[x].U;
}
void resuUD(int x)
{
d[d[x].U].D = d[d[x].D].U = x;
}
void delLR(int x)
{
d[d[x].L].R = d[x].R; d[d[x].R].L = d[x].L;
}
void resuLR(int x)
{
d[d[x].L].R = d[d[x].R].L = x;
}
void delcol(int c)
{
for (int i=d[c].D; i != c; i = d[i].D) delLR(i);
}
void resucol(int c)
{
for (int i=d[c].U; i != c; i = d[i].U) resuLR(i);
}
int h()
{
bool vst[MAXM]; memset(vst, 0, m + 1);
int z = 0;
for (int i=d[0].R; i; i = d[i].R) if (!vst[i]) {
vst[i] = 1; z++;
for (int j=d[i].D; j != i; j = d[j].D) for (int k=d[j].R; k != j; k = d[k].R) vst[d[k].c] = 1;
}
return z;
}
void dfs(int v)
{
if (v + h() >= res) return;
if (!d[0].R) {res = v; return;}
int min = INF, x;
for (int i=d[0].R; i; i = d[i].R) if (cols[i] < min) {min = cols[i]; x = i;}
for (int i=d[x].D; i != x; i = d[i].D) {
delcol(i);
for (int j=d[i].R; j != i; j = d[j].R) delcol(j);
dfs(v + 1);
for (int j=d[i].L; j != i; j = d[j].L) resucol(j);
resucol(i);
}
}
void pri()
{
printf("%d\n", res);
}
int main()
{
init();
dfs(0);
pri();
return 0;
}
鎬葷粨錛欴LX綺劇‘瑕嗙洊鍜岄噸澶嶈鐩栧叾瀹炴槸鏈夊ぇ鐢ㄧ殑錛屽緢澶氭悳绱㈤棶棰橀兘鍙互杞寲涓鴻繖涓ょ闂錛屾晥鐜囧楂樻棤姣旓紝涓斿啓璧鋒潵涔熷緢瀹規(guī)槗錛堝彧鏄湪寤烘ā鐨勬椂鍊欏彲鑳芥湁鐐圭尌鐞愶紝涓嬮潰鐨勬ā鏉匡紝鍜岀綉緇滄祦涓鏍鳳紝10min鐨勪簨錛夛紝鑷充簬NOIP2009寮曞嚭鐨勬暟鐙郴鍒楅棶棰橈紝綺劇‘瑕嗙洊鍙互鐩存帴縐掓潃銆?br>
]]>