ZJOI 2009 狼和羊的故事 網路流

2021-07-26 00:06:09 字數 1377 閱讀 9179

題目:

「狼愛上羊啊愛的瘋狂,誰讓他們真愛了一場;狼愛上羊啊並不荒唐,他們說有愛就有方向......」 orez聽到這首歌,心想:狼和羊如此和諧,為什麼不嘗試羊狼合養呢?說幹就幹! orez的羊狼圈可以看作乙個n*m個矩陣格仔,這個矩陣的邊緣已經裝上了籬笆。可是drake很快發現狼再怎麼也是狼,它們總是對羊垂涎三尺,那首歌只不過是乙個動人的傳說而已。所以orez決定在羊狼圈中再加入一些籬笆,還是要將羊狼分開來養。 通過仔細觀察,orez發現狼和羊都有屬於自己領地,若狼和羊們不能呆在自己的領地,那它們就會變得非常暴躁,不利於他們的成長。 orez想要新增籬笆的盡可能的短。當然這個籬笆首先得保證不能改變狼羊的所屬領地,再就是籬笆必須修築完整,也就是說必須修建在單位格仔的邊界上並且不能只修建一部分。

檔案的第一行包含兩個整數n和m。接下來n行每行m個整數,1表示該格仔屬於狼的領地,2表示屬於羊的領地,0表示該格仔不是任何乙隻動物的領地。

思路:一開始沒往網路流想,想了一些亂七八糟的找規律方法,無果。看了標籤才想到做法......

將每個格仔當做乙個點,源點s向所有1連邊,所有2向匯點t連邊,其邊權均為inf;然後0或1向相鄰的0或2的點連邊,其邊權均為1;這樣問題轉化為使源點不能到達匯點的最小割。權當複習一遍dinic吧。。。

**:

#include #include #include #include #include #include #define for(i,j,k) for(int i = j;i <= (int)k;i++)

#define forr(i,j,k) for(int i = j;i >= (int)k;i--)

#define set(i,j) memset(i, j, sizeof(i))

#define pb push_back

using namespace std;

const int n = 110, m = n * n;

const int d[4][2] = ;

int n, m, cnt = 1, map[n][n], id[n][n];

struct edge;

struct dinic, g[x].pb(e++);

e[e] = (edge), g[y].pb(e++);

} bool bfs()

} return vis[t];

} int dfs(int h, int f)

} return sum;

} int maxflow(int s, int t)

return ans;

}}s;

int main()

for(v,0,3)

} printf("%d\n", s.maxflow(0, 1));

return 0;

}

ZJOI2009 狼和羊的故事

點此看題 考查網路流的建圖,要把羊和狼分割開來,很容易想到最小割問題,下面講一下建圖的方法 然後我們的圖就建出來了,這時候跑最大流就是答案。include include include include define inf 0x3f3f3f3f const int maxn 10005 using...

ZJOI2009 狼和羊的故事

solution 考慮 1 和 2 相鄰是必須要長度為 1 的籬笆,所以只需考慮 1,2 和 0 之間要不要放籬笆,用 s 連向所有的 1 所有的 2 連向 t 現在問題是要使 s 與 t 不連通,這不是經典的最小割問題嗎?code include include includeusing name...

ZJOI2009狼和羊的故事 dinic網路流

題意就是任意兩個1和2都不能有路徑相連通。做法是最小割,但是暴力增廣會t4個點,而dinic沒記cur陣列會t2個點,開了以後速度飛快。include include include includeusing namespace std const int maxn 105,maxn maxn ma...