luoguAC500紀念 騎士共存問題

2022-08-13 08:00:18 字數 1703 閱讀 6452

事前宣告:這不是乙份題解,而是一次真正的做題記錄,題解反而是次要的。。。

所出現的錯誤均已加入《gg記錄》:

題意簡述:n*n的方陣中,有m個障礙點,不能放騎士,求一種方案,能放下最多的騎士,使他們互不攻擊。

顯然,黑格的騎士只能攻擊到白格,白格的騎士只能攻擊到黑格,至於障礙點,當它不存在過就好了。

然後,這就轉化為了乙個點控制其他點,求最多能取幾個點的問題。

我已經做過方格取數問題(啦,源點向所有黑點連一條邊,流量為1,所有白點向匯點連一條邊,流量為1,每個黑點向它能控制的白點連一條邊,流量無限大。建完圖跑個最小割,這樣就能保證所有騎士互不攻擊了,最後拿總點數減去障礙點數再減去最小割就好啦,這個題流量還只有1和無限大,不久資料範圍大點嘛,網路流的時間複雜度不是o(跑得過)嗎?(滑稽)。

然後。。。

ac wa tle re都有。。。exm?

冷靜地觀察了一下,哦,把方陣當成n*m的了,怪不得靜態差錯沒看出來,沒關係,再來一次。

只有54分,唔。。。有個i和j敲反了。。。手賤。。。。這次應該能ac了吧

81分,t了兩個點,o2優化也沒半點用,嗯。。。看來dinic太慢了,換isap!

然而看討論的時候dalao說dinic有優化,趕快去增長姿勢。

woc!弧優化的dinic跑過isap了,玄學!(其實並不)

總之ac了,上**吧。

#include#include

#include

#include

using

namespace

std;

const

int inf=(1

<<30

);const

int t=50001

;void read(int &y)

}int nx[8]=;

int ny[8]=;

int n,m,a[205][205],zx,zy,cnt=1

;struct

edge

e[500003

];int head[50003],dis[50003

];void add(int x,int y,int

z)int dfs(int x,int

f) }

if(!tmp) dis[x]=0

;

return

tmp;

}int

bfs()

}return

dis[t];

}int

dinic()

intmain()

for(register int i=1;i<=n;i++)

}else add(i*n+j,t,1

); }

}printf("%d

",n*n-m-dinic());

return0;

}

50 構造佇列

個人水平有限,請見諒!小明同學把1到n這n個數字按照一定的順序放入了乙個佇列q中。現在他對佇列q執行了如下程式 while q.empty 佇列不空,執行迴圈 做取出隊頭的值操作的時候,並不彈出當前隊頭。小明同學發現,這段程式恰好按順序輸出了1,2,3,n。現在小明想讓你構造出原始的佇列,你能做到嗎...

5 0 目錄操作

表示當前目錄 表示上級目錄 表示home下使用者目錄 注 所有隱藏的檔案或資料夾都是以點 開頭,所以建立隱藏檔案或資料夾只需要在名字前加點就行 1 當前路徑 pwd 2 建立目錄 mkdir 命令 mkdir 目錄 mkdir aaa 在當前目錄下建立乙個名為aaa的目錄 mkdir usr aaa...

50 迴圈巢狀

迴圈巢狀概述 語句結構 順序語句 以分號結尾,表示一句話的結束 分支語句 一對大括號表示if的整體結構,整體描述乙個完整的if語句 一對大括號表示switch的整體結構,整體描述乙個完整的switch語句 迴圈語句 一對大括號表示for的整體結構,整體描述乙個完整的for語句 一對大括號表示whil...