1002:redraw beautiful drawings
最大流。。。。用sap+gap優化的模版過的。。。
1.源點
->
每一行對應的點,流量限制為該行的和 2.
每一行對應的點
->
每一列對應的點,流量限制為k
3.每一列對應的點
->
匯點,流量限制為該列的和
跑一遍最大流。
如果流量小於總權值和,那麼說明impossible。
如果等於:
構建殘圖網路,如果殘圖網路可以形成一條迴路,那麼說明有多解。
#include #include #include #include #includeusing namespace std;
#define inf 99999999
const int maxn =810;
const int maxm =2*410*410+410*4;
const int oo = 1<<29;
struct arclist
edge[maxm];
void init()
void add(int u, int v, int w)
int sap(int s, int e, int n)
aug[s] = oo;
pre[s] = -1;
gap[0] = n;
while(dis[s]0 && dis[u]==dis[v]+1)
}if(flag==false)
if(dfs())
int n=30*2+1;
int m=30*3-3;
cout<> n >> m;
vector> edges[111];
for(int i = 0; i < m; i++)
dequeq;
vectordist(n+1, ~0ull>>1);
vectorinqueue(n+1, false);
dist[1] = 0;
q.push_back(1);
inqueue[1] = true;
int doge = 0;
while(!q.empty())
for(vector>::iterator it = edges[x].begin();
it != edges[x].end(); ++it)}}
inqueue[x] = false;
}return dist[n];
}int main()
// spfa_slf();
// cout<<"-00"<
hdu多校第三場
題意是將給出的數相加計算出 其中p 的倍數的最大個數。由題意可得,在任意兩個數相加時,其模值必在0 p 1之間,將兩數相加的模值替換掉之前的兩個數字,得到長度減一的效果,用0和1 標記對應模值是否出現,從而代表被處理過的但還沒有達到 p 的倍數的值,直到某次得到的模值為 0 時,再清空之前的標記 代...
2013第三場多校
第三場多校 至今最慘的一場多校。共作出兩題。1008 狀態壓縮優化的搜尋 0 比賽時候直接狀態壓縮dp,結果tle了。沒有算好時間複雜度,第一次交的時候沒有測大資料。應該多想幾種方法,做到一a才行,不然卡題會卡很久。1 後來直接搜尋,從最後乙個狀態開始搜,每次都用乙個回文串,然後搜另乙個的最小步數。...
2016多校聯合第三場 HDU5760
給你個 n 然後 n個數,你要找到乙個最長的序列 s 輸出其長度,並且輸出不同的 s的個數。s 序列必須是回文的,並且中間最小,往兩邊依次增大,可以相等。s1 與s2 不同當且僅當長度不同或者存在某位s1 i s2 i 這個dp比較難。n範圍比較小,先把 a 陣列離散化。方便之後處理。再預處理兩個陣...