1. 程式人生 > >NOIP模擬賽(3)

NOIP模擬賽(3)

A:給定一張邊權為1的有向圖,點i另外擁有一個編碼vi,若vi&vj=vj,則i到j額外存在一條有向邊,求1到各點的最短路。不難想到列舉子集建圖,但是龐大的邊數難以存下。考慮一個優化,令dis[i][0/1]表示1到i最後一條邊是通過原路徑/附加路徑轉移過來的,這樣的話列舉子集時只用列舉二進位制上相差一個元素的。轉移時若(u,v)為附加路徑,且通過dis[u][1]轉移,則邊權為0。不難證明這樣的圖與原圖是等價的。注意,如果連滿邊的話邊數最壞是n2。所以對編碼相同的點用一個環來代替完全圖,因為都是強連通分量,所以不改變性質。對於編碼不同但滿足要求的只需要隨便連一條邊即可。 B:給定n個點以及5個數組x,a,b,c,d。從 i 到 j,首先要花費時間|x[j]-x[i]|。假如 i<j,還需額外花費時間 d[i]+a[j],如果 i>j,需額外花費時間 c[i]+b[j]。最大化不相交的環的邊權之和。考慮dp,設f[i][j][k]為前i個點有j個點需要變連進來,有k個點需要連出去的最大和,列舉每個點的4種情況轉移。不難發現,若存在一個環未連上,則一定有一個需要連進來,一個需要連出去。可以把j,k壓成一維。