POJ 1637 Sightseeing tour 混合圖歐拉回路存在性判斷

沒有想到網絡流還能解決這一類問題,完全想不到@_@

一開始把所有的無向邊制定任意方向有當做有向邊看,然后統計每個點的入度和出度。以前有向圖的歐拉回路判定是每個點的入讀都等于出度,這樣可以保證可以回到起點,現在在一些邊可以調換方向的情況下,所有定點的入度和出度之差必定為偶數,因為調換任意一條邊的方向都會使兩個定點的入度和出度變化2,所以要構成一個歐拉回路所有點的入度和出度之差都為偶數,并設差為deg。

現在問題轉化成了能否通過改變一些邊的方向來是的所有點的入度出度都為0,因為有向邊的方向已經確定,不用理會,把他們全部都刪去。剩下的邊中如果有出度大于入度的,肯定要調換-deg/2條邊來使其變成0,建立源點到這些點的邊,容量為-deg/2,同理,有出入大于入度的,就建立這些點到匯點的邊,容量同樣為deg/2。其他的邊容量都為1,然后做一遍最大流,如果流量和需要調換的邊數相等,即源點出去的邊全部都滿載,就有歐拉回路存在,否則不存在歐拉回路。

為什么這樣子是成立的,我的想法是這樣的,除了連接源點和匯點的邊之外,其他的邊的容量都為1,1的流量對應的就是一條邊,源點連接到一個點的時候的容量為t,如果滿載相當于這個點出發的t條邊滿載,相當于調換了t條邊,但是這樣子會影響后面的邊的度,不過因為流會一直流到匯點,中途所有的滿載的邊都是要調換的,所以中間原本度為0的點的度其實到最后不會改變。

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <climits>
#include <string>
#include <iostream>
#include <map> 
#include <cstdlib>
#include <list>
#include <set>
#include <queue>
#include <stack>using namespace std;typedef long long LL;
const int maxn = 205;
const int INF = INT_MAX / 3;struct Edge {int u,v,cap;Edge(int u,int v,int cap):u(u),v(v),cap(cap) {}
};int n,m,incnt[maxn],outcnt[maxn];
int deg[maxn],s,t;
vector<Edge> edges;
vector<int> e[maxn];void adde(int u,int v,int w) {int m = edges.size();edges.push_back(Edge(u,v,w));edges.push_back(Edge(v,u,0));e[u].push_back(m);e[v].push_back(m ^ 1);
}int level[maxn],q[maxn * 2],qs,qe;
bool bfs() {//建立層次網絡memset(level,0,sizeof(level));level[s] = 1;qs = qe = 0;q[qe++] = s;while(qs < qe) {int now = q[qs++],nm = e[now].size();if(now == t) break;for(int i = 0;i < nm;i++) {Edge &ne = edges[e[now][i]];if(ne.cap && level[ne.v] == 0) {level[ne.v] = level[now] + 1;q[qe++] = ne.v;}}}return level[t];
}int dfs(int now,int alpha) {if(now == t) return alpha;int sum = 0,nm = e[now].size();for(int i = 0;i < nm;i++) {Edge &ne = edges[e[now][i]];if(level[now] + 1 == level[ne.v] && ne.cap && alpha) {int ret = dfs(ne.v,min(alpha,ne.cap));ne.cap -= ret; edges[e[now][i] ^ 1].cap += ret;sum += ret; alpha -= ret;}}if(sum == 0) level[now] = -1;return sum;
}void dinic() {while(bfs()) dfs(s,INF);
}bool solve() {s = 0; t = n + 1;//判斷入度出度之差是否為偶數for(int i = 1;i <= n;i++) {deg[i] = incnt[i] - outcnt[i];if(deg[i] & 1) return false;}//建立容量網絡for(int i = 1;i <= n;i++) {//如果入度小于出度,建立從起點到這個點的邊,容量為deg/2if(deg[i] < 0) adde(s,i,-deg[i] / 2);//如果出度大于入讀,建立從當前點到匯點的邊,容量同樣為deg/2if(deg[i] > 0) adde(i,t,deg[i] / 2);}//計算最大流dinic();//判斷從源點出發的所有邊是否滿流int m = e[s].size();for(int i = 0;i < m;i++) {if(edges[e[s][i]].cap != 0) return false;}return true;
}int main() {int T; scanf("%d",&T);while(T--) {scanf("%d%d",&n,&m);edges.clear();for(int i = 0;i <= n + 1;i++) e[i].clear();memset(incnt,0,sizeof(incnt));memset(outcnt,0,sizeof(outcnt));for(int i = 1;i <= m;i++) {int u,v,c; scanf("%d%d%d",&u,&v,&c);//先將無向邊全部作為有向邊處理incnt[v]++; outcnt[u]++;//無向邊存起來if(c == 0) adde(u,v,1);}if(solve()) puts("possible");else puts("impossible");}return 0;
}

  

轉載于:https://www.cnblogs.com/rolight/p/3871431.html

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

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

相關文章

linux系統 硬鏈接和軟鏈接

背景&#xff1a; 當幾個用戶同在一個項目里工作時。經常須要共享文件。假設一個共享文件同一時候出如今屬于不同用戶的不同文件夾下。工作起來就非常方便。比如B和C文件夾下有一文件D是兩者都能夠訪問和改動的共享文件&#xff0c;這樣是非常方便&#xff0c;但也會有一些問題…

jquery純數字驗證

$(document).ready(function(){ //純數字驗證,只讓輸入數字,比如-號等都不然輸入。 $(#user-defined).unbind(); $(#user-defined).bind(keyup change,function () { $(this).val($(this).val().replace(/\D/g,));}); });轉載于:https://www.cnblogs.com/kuiyeit/p/47940…

閃電模型數學_最經典的數學模型

最經典的數學模型怎樣得到最好的女孩子的數學模型【關鍵詞】怎樣得到最好女孩子數學模型由于老天爺在你的生命中安排的異性并不是同時出現任你挑選&#xff0c;因此無論你在何時選擇結婚都是有機會成本的。人們常常希望能夠獲得一個最可愛的人作為自己的伴侶。但是&#xff0c;…

最近提交一個mysql5.7的bug,提醒自己以后注意寫SQL要規范

最近幫朋友提交一個mysql5.7的bug , oracle mysql 的大神還回復我 , 以后注意書寫sql規范 , 潛臺詞是不是不要給他們增加工作量 https://bugs.mysql.com/bug.php?id86610轉載于:https://www.cnblogs.com/kelvin19840813/p/7052983.html

openssl 學習之從證書中提取RSA公鑰N 和 E

原文鏈接: http://blog.csdn.net/kkxgx/article/details/19850509 通常數字證書包含很多信息&#xff0c;其中N和E值即我們稱為的公鑰。如何從PEM 或者DER格式的證書中提出證書呢&#xff1f;下面給出代碼實現從PEM和DER編碼的證書中提出N、E。 [cpp] view plaincopy #include …

獲得漢字字符個數

//獲得漢字字符個數function ChineseWordsCount(text:string):Integer;var i,sum,e,c,t: Integer;begin Result:0; c : 0; sum : Length(text); if Sum0 then exit; for i : 0 to sum do begin if Ord(text[i]) > 127 then begin Inc(c); end; end;…

2020湖南省技能競賽獲獎名單_2020年湖南省職業院校技能競賽學院獲獎情況通報...

由湖南省教育廳、湖南省人力資源和社會保障廳、湖南省農業農村廳等30個單位聯合舉辦的2020年湖南省職業院校技能競賽于2019年12月28日已經圓滿結束所有競賽項目&#xff0c;我院選派了190名選手參加了園林景觀設計與施工、雞新城疫抗體水平測定、集成電路開發及應用、農機維修、…

Web browser的發展演變

我們每天都在使用著瀏覽器&#xff0c;每個人使用的瀏覽器各不一樣。在這個科技飛速發展的時代&#xff0c;一個游覽器能否站住腳跟取決于使用者的數量&#xff0c;看用戶是否喜歡這個產品&#xff0c;聽取用戶們的意見來改善。 我們這個年齡的人最初用到的瀏覽器肯定是IE瀏覽器…

nodejs簡單層級結構配置文件

在NodeJS中使用配置文件&#xff0c;有幾種比較不錯的方案&#xff1a;第一種&#xff1a;文件格式使用json是毋容置疑的好方案。格式標準&#xff0c;易于理解&#xff0c;文件內容讀取到內存之后&#xff0c;使用JSON的標準分析函數即可得到配置項。第二種&#xff1a;將配置…

C++語言基礎(1)-命名空間

一個中大型軟件往往由多名程序員共同開發&#xff0c;會使用大量的變量和函數&#xff0c;當有兩個人都同時定義了一個名字相同的全局變量或函數的時候&#xff0c;若是把他們的代碼整合在一塊編譯&#xff0c;此時編譯器就會提示變量或函數重復定義&#xff0c;C為了解決這個問…

matlab 散點圖 線性回歸圖_線性回歸思路梳理

作者&#xff1a;夏雨驕陽 封面&#xff1a;自己想吧1簡單線性回歸1根據研究目的確定因變量和自變量。2判斷有無異常值。通過繪制散點圖直觀觀察&#xff1b;亦可通過線性回歸的【統計】→【個案診斷】→【所有個案】進行分析&#xff0c;若標準殘差超過[-3,3]&#xff0c;則…

物聯網云端設計分析

物聯網是世界信息產業發展的新浪潮&#xff0c;智能手表、智能手環、智能燈等物聯網產品不斷的改變著人們的生活方式。那這些產品是怎么設計出來的呢&#xff1f;其實物聯網操作系統不光由本地物聯網設備上的操作系統組成&#xff0c;還包括提供物聯網終端設備支持的云端架構。…

PHP使用文件流下載文件方法(附:解決下載文件內容亂碼問題)

記得高中時候做過游戲私服&#xff0c;那時候的游戲主頁是用PHP寫的&#xff0c;因為文件很固定&#xff0c;客戶端&#xff0c;登陸器和一些小工具&#xff0c;文件數目也不是很多&#xff0c;所以都是直接把下載鏈接寫死的&#xff0c;直接鏈接到本地服務器的文件目錄&#x…

Redis和Memcached的區別

2019獨角獸企業重金招聘Python工程師標準>>> Redis的作者Salvatore Sanfilippo曾經對這兩種基于內存的數據存儲系統進行過比較&#xff1a; Redis支持服務器端的數據操作&#xff1a;Redis相比Memcached來說&#xff0c;擁有更多的數據結構和并支持更豐富的數據操作…

hbase hmaster一會就沒了_淺析HBase

一、HBase簡介1、Apache HBase?是Hadoop數據庫&#xff0c;是一個分布式&#xff0c;可擴展的大數據存儲。2、當您需要對大數據進行隨機&#xff0c;實時讀/寫訪問時&#xff0c;請使用Apache HBase?。 該項目的目標是托管非常大的表&#xff08; 數十億的行*百萬的列 &#…

【Android工具】DES終結者加密時報——AES加密演算法

轉載請注明出處&#xff1a;http://blog.csdn.net/zhaokaiqiang1992在前面的兩篇文章中。我們介紹了DES算法&#xff0c;3DES算法以及他們的Android程序實現&#xff0c;并研究了怎樣才干實現不同平臺下加密算法的一致性。只是話說起來&#xff0c;DES算法是在1976年被美國的國…

MATLAB 迭代法解方程

MATLAB 迭代法解方程 1、代碼如下&#xff1a; %%牛頓迭代法解方程 function xnewton_interation(fun,dfun,x0,EPS) %簡單牛頓迭代法%fun即迭代函數&#xff0c;dfun即迭代函數的一階導數&#xff0c;x0為迭代初值&#xff0c;EPS為精度x1x0-fun(x0)/dfun(x0); %牛頓迭代公…

【12期 3月期刊 自薦】

12期的小伙伴看過來~因為網易博客的網絡問題。我們把負責收集自薦的博客寫到了CSDN里&#xff0c;希望大家在此篇博客的評論里&#xff0c;積極自薦自己的博客。 為了提高大家的積極性&#xff0c;我們評選優秀博客的方法升級為大家自薦博客&#xff0c;博客委員會當月負責人進…

超微服務器電源短接啟動圖解_教你一招,讓你的電腦啟動速度秒殺別人

win10快速啟動其實是電腦的一種休眠模式&#xff0c;它將電腦中的一些本該關閉的文件保存到hiberfil.sys的磁盤文件中&#xff0c;這樣打開電腦時就達到了快速開機的目的。接下來&#xff0c;我就將win10設置快速啟動的方法分享給你們win10系統功能非常強大&#xff0c;最讓大家…

MATLAB 求離散信號卷積

MATLAB 求離散信號卷積 代碼如下&#xff1a; function [C,Ck] dt_convolution_advance(A,B,Ak,Bk) % dt_convolution_advance 計算離散信號卷積 % A 輸入信號 % B 輸入信號 % Ak 輸入信號A下標 % Bk 輸入信號B下標 % C 輸出信號 % Ck 輸出信號C下標 % 計算輸入信號A&…