dfs 2-sat被卡得好開心啊
這道題目乍一看是一道「3-sat」的題目,變數是每個地圖,選擇是車的型別。
但要注意乙個事實:除了那d個地圖之外,其它的地圖事實上只有2種選擇。而對於那d個x型地圖,我們可以窮舉假設它是a型或b型,因為a型、b型的合法選擇的並還是x型,所以不影響答案。
接下來就是連邊的問題了,這道題並不是一道完全的2-sat題,所以沒法直接套用模板,但連邊的過程很相似。設\(u\)為\((i,h_i)\)拆出的節點,\(v\)為\((j,h_j)\)拆出的節點,\(u'\)、\(v'\)分別是\(u\)、\(v\)的否節點,則連線邊\((u,v)\)、\((v',u')\)(第二個是逆否命題)
然後直接對構建出的圖跑一遍tarjan,如果發現\(u\)和\(u'\)在同乙個scc裡面,就說明有矛盾。在輸出解時對於\(u\)和\(u'\),選擇其中sccno較小的那個輸出。
#include#include#include#include#include#include#includeusing namespace std;
const int maxn=5e4+5;
const int maxm=1e5+5;
int n,d,m,p[10],x[maxm],y[maxm];
char s[maxn],a[maxm],b[maxm];
vectorg[maxn*2];
int id[maxn][70];
int dfn[maxn*2],lowlink[maxn*2],sccno[maxn*2],dfs_cnt,scc_cnt;
stackstk;
void dfs(int u)
) if(id[i][c]>-1) printf("bid[%d][%d]=%c\n",i,c,id[i][c]);
// }
for(int i=0;isccno[i*2+1]]);
#ifdef local
// puts("");
#endif
exit(0);
}int main()
d=0;
for(int i=0;ifor(int st=0;st<(1
#ifdef local
// puts("");
#endif
return 0;
}
題解 洛谷 P3825 NOI2017 遊戲
從題麵中四元組 i,h i,j,h j 限制選擇車子型號,不難想到這題要用 2 sat 解決。考慮轉化為 2 sat 模型,發現除地圖 x 外,其他地圖都只有兩種車子型號可以參加,那麼就把這兩種型號轉化為兩種狀態。若 s i a 則狀態為 b 和 c 若 s i b 則狀態為 a 和 c 若 s i...
UOJ317 NOI2017 遊戲 題解
小 l 計畫進行 n 場遊戲,每場遊戲使用一張地圖,小 l 會選擇一輛車在該地圖上完成遊戲。小 l 的賽車有三輛,分別用大寫字母 a b c 表示。地圖一共有四種,分別用小寫字母 x a b c 表示。其中,賽車 a 不適合在地圖 a 上使用,賽車 b 不適合在地圖 b 上使用,賽車 c 不適合在地...
題解 NOI2017整數 線段樹
在人類智慧型的山巔,有著一台字長為10485761048576位 此數字與解題無關 的超級計算機,著名理論計算機科 學家p博士正用它進行各種研究。不幸的是,這天颱風切斷了電力系統,超級計算機 無法工作,而 p 博士明天就要交實驗結果了,只好求助於學過oi的你.p 博士將他的計算任務抽象為對乙個整數的...