題目大意:
盡可能多地去掉乙個有向無環圖上的邊,使得圖的連通性不變。
思路:拓撲排序,然後倒序求出每個結點到出度為$0$的點的距離$d$,再倒序遍歷每乙個點$x$,以$d$為關鍵字對其出邊降序排序,嘗試加入每一條邊,若加邊之前兩點已經連通,則說明這條邊可以刪去。可以用bitset維護圖的連通性,注意原圖是有向圖,因此不能用並查集維護。
1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 inline intgetint()
15const
int v=30001
;16 std::vectore[v];
17 inline void add_edge(const
int u,const
intv)
20int
n;21
intin[v]=,top[v]=;
22 inline void
kahn()
27int cnt=0;28
while(!q.empty()) 37}
38}39}
40struct
vertex
45};
46vertex v[v];
47int dis[v]=;
48int ans=0
;49 inline bool cmp(const
int x,const
inty)
52 inline void
dp() ;55}
56 std::sort(&v[0],&v[n],std::greater());
57for(int i=0;i) 63}
64}65 std::bitsetbit[v];
66 inline void
cut() 76}
77}78int
main()
85kahn();
86dp();
87cut();
88 printf("
%d\n
",ans);
89return0;
90 }
JSOI2015 染色問題
傳送門 雖然不是第一反應,不過還是想到了要容斥。題意轉化 需要求滿足 n m c 個條件的方案數。然後我們就列舉三個數 i,j,k 表示當前方案中,至少不用 k 種顏色,至少不塗 i 行 至少不塗 j 列。然後直接組合數算 式子不難看懂 最後容斥即可。那麼寫出來就是 ans sum n sum m ...
JSOI2015 子集選取
傳送門 看到這個資料範圍,就知道肯定是要找規律。如果把集合看成乙個長度為 n 的 01 串,0 表示沒有這個元素,1 表示有這個元素,那麼我們可以發現對於題中的約束關係,不同位上的 01 之間不會互相影響。那麼我們只需要對於只有一位也就是 n 1 的情況計算出方案 記為 x 那麼最後的答案就是 x ...
JSOI2015 染色問題 題解
傳送門 容斥原理 把三個容斥套一起 我們列舉至少有i ii行沒有染色,至少j jj列沒有染色,至少k kk種顏色沒有用到,那麼剩下 n i m j n i m j n i m j 個格仔每個都有c 1 k c 1 k c 1 k種選擇 可以在剩下c k c kc k種顏色中挑一種,也可以不染色 因此...