事前宣告:這不是乙份題解,而是一次真正的做題記錄,題解反而是次要的。。。
所出現的錯誤均已加入《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...