1. 程式人生 > >BZOJ 1339 Baltic 2008 Mafia 最小點割集

BZOJ 1339 Baltic 2008 Mafia 最小點割集

題目大意:一個城市中有些點,有一些雙向道路將這些點連線起來,每個點都有權值,求警察最少佔據的點的權值和使得從A點無法到達B點。

思路:最小點割集簽到題。

CODE:

#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAX 80010
#define INF 0x3f3f3f3f
using namespace std;
#define min(a,b) ((a) < (b) ? (a):(b))

int points,edges;
int S,T;
int head[MAX],total = 1;
int next[MAX],aim[MAX],flow[MAX];

inline void Add(int x,int y,int f)
{
	next[++total] = head[x];
	aim[total] = y;
	flow[total] = f;
	head[x] = total;
}

int deep[MAX];

inline bool BFS()
{
	static queue<int> q;
	while(!q.empty())	q.pop();
	memset(deep,0,sizeof(deep));
	deep[S] = 1;
	q.push(S);
	while(!q.empty()) {
		int x = q.front(); q.pop();
		for(int i = head[x]; i; i = next[i])
			if(flow[i] && !deep[aim[i]]) {
				deep[aim[i]] = deep[x] + 1;
				q.push(aim[i]);
				if(aim[i] == T)	return true;	
			}
	}
	return false;
}

int Dinic(int x,int f)
{
	if(x == T)	return f;
	int temp = f;
	for(int i = head[x]; i; i = next[i])
		if(flow[i] && temp && deep[aim[i]] == deep[x] + 1) {
			int away = Dinic(aim[i],min(flow[i],temp));
			if(!away)	deep[aim[i]] = 0;
			flow[i] -= away;
			flow[i^1] += away;
			temp -= away;
		}
	return f - temp;
}

int main()
{
	cin >> points >> edges >> S >> T;
	S <<= 1,T = (T << 1|1);
	for(int x,i = 1; i <= points; ++i) {
		scanf("%d",&x);
		Add(i << 1,i << 1|1,x);
		Add(i << 1|1,i << 1,0);
	}
	for(int x,y,i = 1; i <= edges; ++i) {
		scanf("%d%d",&x,&y);
		Add(x << 1|1,y << 1,INF);
		Add(y << 1,x << 1|1,0);
		Add(y << 1|1,x << 1,INF);
		Add(x << 1,y << 1|1,0);
	}
	int max_flow = 0;
	while(BFS())
		max_flow += Dinic(S,INF);
	cout << max_flow << endl;
	return 0;
}


相關推薦

BZOJ 1339 Baltic 2008 Mafia

題目大意:一個城市中有些點,有一些雙向道路將這些點連線起來,每個點都有權值,求警察最少佔據的點的權值和使得從A點無法到達B點。 思路:最小點割集簽到題。 CODE:#include <queue> #include <cstdio> #inclu

BZOJ 3630 JLOI 2013 鏡面通道

去年省選的題,當時還不會,於是就機智的採用了O(1)演算法(輸出0),得了10分。 現在想想當時還是太菜了啊…… 現在也很菜啊,邊連錯了好幾遍。。。 寫這個題還學會了 :: 的用法。。還是太菜了啊。。 廢話不多說,題意簡單。拆點進行最小割即可 注意連線的邊啊,要是考試的時

POJ 1815 - Friendship - [拆大流求][暴力枚舉求升序] - [Dinic算法模板 - 鄰接矩陣型]

ica exc otherwise 枚舉 cstring hat blog things input 妖怪題目,做到現在:2017/8/19 - 1:41…… 不過想想還是值得的,至少鄰接矩陣型的Dinic算法模板get√ 題目鏈接:http://poj.org/probl

無向圖解法

from: http://www.cppblog.com/imky/archive/2010/08/14/123414.html 無向圖最小點割集,確定起點S,終點T。每個點都有自己的點權值vi,求最小點權和的割點集,使得S無法到達T。 解法:將每個點拆分為兩個點v和v',

poj 1815 Friendship(

Friendship Time Limit: 2000MS Memory Limit: 20000K Total Submissions: 8465 Accepted: 2370 Description In modern society, each person

POJ 3041 Asteroids (二分圖覆蓋

0ms ext ted with width any print scrip avi Asteroids Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 24789

二分圖覆蓋模板(Java版)

import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner; public class Main{

[PKU 3715]Blue and Red(覆蓋)

【題目大意】: 軍事演習 分為紅藍方但是有的兵是好友 不能被分在不同方問最少刪掉多少人 滿足條件輸出 刪掉人的序號(字典序最小) 【題目分析】: 一個天津的童鞋問我的~看了看……最開始悲劇了一下~ 寫寫發現還可以,1A之~ 比較裸的一個最小點覆蓋集,konig定理證明就自己翻

無向圖全域性

一個無向連通網路,去掉一個邊集可以使其變成兩個連通分量則這個邊集就是割集;最小割集當然就權和最小的割集。 可以用最小切割最大流定理: 1.min=MAXINT,確定一個源點 2.列舉匯點 3.計算最大流,並確定當前源匯的最小割集,若比min小更新min 4.轉到2直到列舉完畢 5.min即為所求輸出min  

[POJ3041] Asteroids(覆蓋-匈牙利算法)

mes 技術分享 set || tdi line isp none event 傳送門 題意: 給一個N*N的矩陣,有些格子有障礙,要求我們消除這些障礙,問每次消除一行或一列的障礙,最少要幾次。 解析: 把每一行與每一列當做二分圖兩邊的點。

BZOJ 2039 人員雇傭()

dfs long pac close lld linker stack type 最小割 最小割的建圖模式一般是,先算出總收益,然後再通過網絡模型進行割邊減去部分權值。 然後我們需要思考什麽才能帶來收益,什麽才能有權值沖突。 s連向選的點,t連向不選的點,那麽收益的減少量應

UVa 11419 我是SAM(覆蓋+路徑輸出)

二分圖 現在 over div space void net https 最小點覆蓋 https://vjudge.net/problem/UVA-11419 題意:一個網格裏面有一些目標,可以從某一行,某一列發射一發子彈,可以打掉它;求最少的子彈,和在哪裏打?

對分治法(洛谷1257)

分治法 nbsp fin -m 描述 ron can 復雜 集中 題目描述 給定平面上n個點,找出其中的一對點的距離,使得在這n個點的所有點對中,該距離為所有點對中最小的 輸入樣例#1: 3 1 1 1 2 2 2 輸出樣例#1: 1.0000首先我

BZOJ 3571 [Hnoi2014]畫框(乘積完美匹配)

ros tdi cnblogs 題目 遠的 i++ for continue tin 【題目鏈接】 http://www.lydsy.com/JudgeOnline/problem.php?id=3571 【題目大意】   給出一張二分圖,每條邊上有a,b兩

覆蓋,二分圖大匹配—POJ1274 POJ1469 POJ1469

-s 要求 ini vector ++ %d () tin clas 二分圖最大匹配常用的匈牙利算法,之前寫的很幼稚,雖然也過了,但是平白的比別人多開了兩倍的空間。 本來就是在填加邊的時候把左邊的點和右邊的點分開算都加在圖裏面儲存,然後匹配的時候就互相匹配 match[u]

POJ - 1325 Machine Schedule 二分圖 覆蓋

code mach 切換 才幹 ces 任務 ack div con 題目大意:有兩個機器,A機器有n種工作模式,B機器有m種工作模式,剛開始兩個機器都是0模式。假設要切換模式的話,機器就必須的重新啟動 有k個任務,每一個任務都能夠交給A機器的i模式或

二分圖權覆蓋 二分圖大權獨立 方格取數

補集 限制 成了 最小 選擇 沒有 構造 最大點權獨立集 棋盤   二分圖最小點權覆蓋:     每一條邊 (u, v) 都是一個限制條件, 要求 u 和 v 不能同時取得.     我們考慮先取得所有的, 然後減去最小的點權.     建立原點 S , 連向二分圖左邊的所

BZOJ 1001 狼抓兔子 (轉化成短路)

names assert urn tdi == space bool ems set 題意:中文題。 析:很容易看出是裸板的最小割,然後可能會超時,邊實在是太多了,有一種特殊的方法,可以把平面圖轉成最短路來求,也就是利用對偶圖,把原圖的而看成新圖的點,原圖的邊與兩個面相連的

HDU 1565 - 方格取數(1) - [狀壓DP][網絡流 - 權獨立權覆蓋]

printf 一個 cnblogs ret com bool limit .net amp 題目鏈接:https://cn.vjudge.net/problem/HDU-1565 Time Limit: 10000/5000 MS (Java/Others) Memory

【noip模擬】覆蓋

mes 都是 ons mar 長度 最小 一句話 標記 com Time Limit: 1000ms Memory Limit: 128MB Description 最小點覆蓋是指在二分圖中,用最小的點集覆蓋所有的邊。當然,一個二分圖的最小點覆蓋可能有很多