Luogu P3731 [HAOI2017]新型城市化

題目顯然可以轉化為求每一條邊對二分圖最大獨立集的貢獻,二分圖最大獨立集\(=\)點數\(-\)最大匹配數,我們就有了\(50pts\)做法。

正解的做法是在原圖上跑\(Tarjan\),最開始我想復雜了,后來才意識到,只要存在這樣一個強連通分量,那么斷掉分量內的任意一條邊都不會破壞其連通性,即不管刪掉哪個連邊都一定會有新的匹配補充。只要讓兩個點不在同一個分量里面,而且原來是滿流的(匹配可行邊),那么它就是一個可用邊(匹配必須邊)。

#include <bits/stdc++.h>
using namespace std;const int N = 400010;
const int M = 800010;
const int INF = 0x3f3f3f3f;struct Graph {int cnt, head[N];struct edge {int nxt, to, f;}e[M];Graph () {cnt = -1;memset (head, -1, sizeof (head));}void add_edge (int u, int v, int f) {e[++cnt] = (edge) {head[u], v, f}; head[u] = cnt;}void add_len (int u, int v, int f) {add_edge (u, v, f);add_edge (v, u, 0);}queue <int> q;int cur[N], deep[N];bool bfs (int s, int t) {memcpy (cur, head, sizeof (head));memset (deep, 0x3f, sizeof (deep));deep[s] = 0; q.push (s);while (!q.empty ()) {int u = q.front (); q.pop ();for (int i = head[u]; ~i; i = e[i].nxt) {int v = e[i].to;if (deep[v] == INF && e[i].f) {deep[v] = deep[u] + 1;q.push (v);}}}return deep[t] != INF;}int dfs (int u, int t, int lim) {if (u == t || !lim) {return lim;}int tmp = 0, flow = 0;for (int &i = cur[u]; ~i; i = e[i].nxt) {int v = e[i].to;if (deep[v] == deep[u] + 1) {tmp = dfs (v, t, min (lim, e[i].f));lim -= tmp;flow += tmp;e[i ^ 0].f -= tmp;e[i ^ 1].f += tmp;if (!lim) break;}}return flow;}int Dinic (int s, int t) {int max_flow = 0;while (bfs (s, t)) {max_flow += dfs (s, t, INF);}return max_flow;}
}G;int n, m, _ans, id[N];struct Query {int u, v;bool operator < (Query rhs) const {return u == rhs.u ? v < rhs.v : u < rhs.u;}   bool operator == (Query rhs) const {return u == rhs.u && v == rhs.v;}
}q[N], ans[N];int A (int x) {return n * 0 + x;}
int B (int x) {return n * 1 + x;}int read () {int s = 0, w = 1, ch = getchar ();while ('9' < ch || ch < '0') {if (ch == '-') w = -1;ch = getchar ();}while ('0' <= ch && ch <= '9') {s = s * 10 + ch - '0';ch = getchar ();}return s * w;
} stack <int> sta;
int dfn[N], low[N], col[N], vis[N]; void Tarjan (int u) {sta.push (u);vis[u] = true;dfn[u] = low[u] = ++dfn[0]; for (int i = G.head[u]; ~i; i = G.e[i].nxt) {int v = G.e[i].to;if (!G.e[i].f) continue;if (!dfn[v]) {Tarjan (v);low[u] = min (low[u], low[v]);} else if (vis[v]) {low[u] = min (low[u], dfn[v]);}}if (dfn[u] == low[u]) {int tmp; ++col[0];do {tmp = sta.top ();vis[tmp] = false;col[tmp] = col[0];sta.pop ();}while (tmp != u);}
}int main () {cin >> n >> m;int s = n * 2 + 1;int t = n * 2 + 2;for (int i = 1; i <= m; ++i) {q[i].u = read ();q[i].v = read ();if (q[i].u > q[i].v) {swap (q[i].u, q[i].v);}}sort (q + 1, q + 1 + m);for (int i = 1; i <= m; ++i) {id[i] = G.cnt + 1;G.add_len (A (q[i].u), B (q[i].v), 1);G.add_len (A (q[i].v), B (q[i].u), 1);}for (int i = 1; i <= n; ++i) {G.add_len (s, A (i), 1);G.add_len (B (i), t, 1);}G.Dinic (s, t);for (int i = 1; i <= t; ++i) {if (!dfn[i]) {Tarjan (i);}}for (int i = 1; i <= m; ++i) {if (col[A (q[i].u)] != col[B (q[i].v)] && !G.e[id[i]].f) {ans[++_ans] = q[i];}}cout << _ans << endl;for (int i = 1; i <= _ans; ++i) {printf ("%d %d\n", ans[i].u, ans[i].v);}
}

轉載于:https://www.cnblogs.com/maomao9173/p/10638348.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/449028.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/449028.shtml
英文地址,請注明出處:http://en.pswp.cn/news/449028.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【數據結構算法】快排/歸并/堆排序 c++

一個用來了解數據結構算法&#xff08;各種排序&#xff0c;列表&#xff0c;樹等&#xff09;很友好的網站&#xff1a; https://visualgo.net/en 該題目來自于牛客&#xff1a;算法篇-排序問題 快排&#xff08;必備&#xff09;歸并&#xff08;體會分治&#xff09;堆(自…

人生的八種投資

1、最心甘情愿的投資&#xff1a;兒女 投資大師羅杰斯一生成功無數&#xff0c;問及他最得意的一次投資時&#xff0c;他說&#xff0c;是自己的女兒。“我曾經覺得養孩子是既麻煩又浪費錢的事情&#xff0c;有了女兒才知道&#xff0c;這才是最能給你帶來幸福感的投資。” …

Linux操作系統load average過高,kworker占用較多cpu

Linux操作系統load average過高&#xff0c;kworker占用較多cpu 今天巡檢發現&#xff0c;mc1的K8S服務器集群有些異常&#xff0c;負載不太均衡。其中10.2.75.32-34&#xff0c;49的load average值都在40以上&#xff0c;雖然機器的cpu核數都是40或48核不算嚴重&#xff0c;但…

[flask]gunicorn配置文件

配置文件 #!/home/xx/.virtualenvs/xx/bin/python # encoding: utf-8import multiprocessing# 監聽端口 bind 0.0.0.0:5000 # 工作模式 worker_class gevent # 并行工作進程數 workers multiprocessing.cpu_count() * 1 # 設置守護進程 daemon True# 設置日志記錄水平 logl…

Linux 上 docker 安裝 oracle-xe-11g

環境&#xff1a; 2G 內存&#xff0c;60G 硬盤阿里云一臺&#xff08;帶寬 1M&#xff09;, 配置如下圖&#xff1a; 軟件&#xff1a;docker Docker version 1.6.2, build 7c8fca2 相關 link docker 鏡像站&#xff1a;https://store.docker.com 視頻教程&#xff1a;ht…

最易忽視的腎虛4件事

腎是人的“先天之本”&#xff0c;如果把人體比喻成一棵大樹&#xff0c;腎就是樹根&#xff0c;吸收、傳遞營養充足&#xff0c;大樹才能枝繁葉茂。腎虛了&#xff0c;可能引起各種健康問題。 然而&#xff0c;在現實中&#xff0c;人們常常會夸大腎虛&#xff0c;很多人把出…

【計算機網絡】wireshark數據流追蹤、圖像抓取(轉)

不廢話了直接上地址 https://www.cnblogs.com/grj001/p/12223954.html

stm32學習方法

很多新手都問過嵌入式系統學習方法&#xff0c;好的學習方法可以事半功倍&#xff0c;學習嵌入式系統&#xff0c;掌握了好的學習方法&#xff0c;自然可以水到渠成。創客學院的老師就通過本篇文章就來說說嵌入式系統學習方法&#xff0c;新手必看 第一&#xff0c;學習基本的裸…

知識點漏缺總結

模塊化 使用模塊化可以給我們帶來以下好處 解決命名沖突 提供復用性 提高代碼可維護性 Proxy Proxy 來替換原本的 Object.defineProperty 來實現數據響應式。 Proxy 是 ES6 中新增的功能&#xff0c;它可以用來自定義對象中的操作。 let p new Proxy(target, handler) 復制代碼…

成功投資的九大要訣

真正的有錢人對金錢持非常嚴肅的態度&#xff0c;即便是拿來投機也要小心睿智&#xff0c;物盡其用。這里的投機并不是指非理性的賭博&#xff0c;而是指為了追求更高收益而采取的市場投資行為。卡西研究所資深分析師Louis James總結了富豪們投機成功的9個秘訣。 秘訣1&#…

《 Docker 技術入門與實戰 》讀書筆記 ( CentOS 安裝 Docker )

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 PS &#xff1a;個人所有讀書筆記只記錄個人想要的內容&#xff0c;很可能原書大量內容沒有納入筆記中... ... 以下全文內容出自書目&…

數據結構:靜態鏈表實現樹的同構

寫在最前面 按照課程講解的思路來寫&#xff0c;邏輯關系能夠理解清楚了&#xff0c;但是實際運行起來實在是有問題&#xff0c;雖然在PTA上能夠通過。但是我自己看不出問題來&#xff0c;并且&#xff0c;看了一遍又一遍仍然看不出來&#xff01;&#xff08;可能自己太笨。。…

中國人為什么學不會英語

英語永遠也學不會! 這種抱怨和哀嘆&#xff0c;大概在中國早已經司空見慣了。于是&#xff0c;有人開始計算學英語是多么大的浪費。 作為過來人&#xff0c;我對此深有體會。記得我當年也有過類似的絕望感。 但是&#xff0c;一位前輩安慰我說&#xff1a;你可以說你永遠掌…

研究人員發現:基于文本的AI模型容易受到改述攻擊

由于自然語言處理&#xff08;NLP&#xff09;的進步&#xff0c;越來越多的公司和組織開始利用AI算法來執行與文本相關的任務&#xff0c;例如&#xff1a;過濾垃圾郵件、分析社交媒體帖子和評論、評估簡歷以及檢測假新聞。 但是&#xff0c;真的可以相信這些算法能夠可靠地執…

解決 linux 下安裝 node 報: command not found

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 注意&#xff1a;有時安裝成功后,需要關閉xshell&#xff0c;重新啟動。nvm才會生效。 1. 在 linux 下安裝 node 提示 -bash: node: com…

阿里云官方網站免費套餐怎么搶

阿里云推出包含云服務器 ECS、負載均衡、云數據庫 RDS、云數據庫 Redis 版、云數據庫 Mongodb 版、彈性公網 IP、CDN、對象存儲 OSS、文件存儲 NAS等40核心云產品&#xff0c;6個月免費使用何為免費套餐&#xff0c;其實就是讓你先體驗&#xff0c;覺得好用&#xff0c;易用&am…

1003 我要通過

1003 我要通過&#xff01; (20 分)“答案正確”是自動判題系統給出的最令人歡喜的回復。本題屬于 PAT 的“答案正確”大派送 —— 只要讀入的字符串滿足下列條件&#xff0c;系統就輸出“答案正確”&#xff0c;否則輸出“答案錯誤”。 得到“答案正確”的條件是&#xff1a; …

在英特爾? 凌動? 處理器上將 OpenGL* 游戲移植到 Android* (第一部分)

將游戲和其他使用大量 3D 圖形的應用從 OpenGL 標準移植到 Google Android 設備&#xff08;包括構建在英特爾 凌動? 微架構上的設備&#xff09;存在巨大的機遇&#xff0c;因為基于 OpenGL 的游戲、游戲引擎和其他傳統軟件易于獲得&#xff1b;OpenGL 便于移植&#xff1b;而…

文件系統:使用 yum 安裝軟件包

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 一、yum命令的基本安裝功能 [rootlocalhost ~]# man yum command is one of: * install package1 [package2] [...]&#xff1a; ins…

elasticsearch全局analyzer聲明

2019獨角獸企業重金招聘Python工程師標準>>> 問題 elasticsearch從2.4升級到5.6&#xff0c;elasticsearch.yml配置中有一些analyzer配置拷貝到新版本&#xff0c;啟動報錯 index :analysis :analyzer :lowercase_whitespace :type : customtokenizer : myTokenizer…