強連通分量 圓桌騎士

題目描述

圓桌騎士是一個非常吸引人的職業。因此,在最近幾年里,亞瑟王史無前例的擴招圓桌騎士,并不令人驚訝。現在這里有許多圓桌騎士,每個圓桌騎士都收到一份珍貴的邀請函,被邀請去英靈殿圓桌。這些騎士將要環繞著坐在一個圓桌旁,但通常只有一小部分騎士會來,因為剩下的騎士正忙著在全國各地為人民服務。
不幸的是,這些圓桌騎士的酒量不行,很容易喝高。當他們喝高時,一些不幸的便當事件將會發生。因此,亞瑟王請來了長門大神,來確保在未來不會有類似的事情發生。在仔細分析了這個問題后,長門大神意識到要想避免騎士之間相互斗毆,當且僅當他們在圓桌旁所坐的位置,符合以下條件:
1. 某些騎士之間有仇,避免相互之間有仇的騎士挨在一塊。
2. 當場上有偶數個騎士時,若通過投票解決問題的話,正方與反方的票數可能相同,這會令騎士們非常不爽。因此,只能有奇數個騎士坐在圓桌旁。
長門大神會盡量的滿足以上兩個條件,否則她會代替亞瑟王宣布散會(若只有一個騎士在場的話,也會宣布散會,因為一個騎士不管怎么坐,都不可能環繞一個圓桌)。這將意味著無論如何安排,一些騎士都無法到場,無法坐在圓桌旁邊(其中一種情況即為當這個騎士對所有騎士都有仇時,當然還可能是其他情況)。若一個圓桌騎士永遠無法到場,則這個騎士就失去了“圓桌”的意義,他將會被開除。這些騎士將會被降級,降到諸如“愛的戰士”“蘑菇騎士”“人魚騎士”之類的職階。
為了幫助長門大神,你必須寫一個程序來計算會有多少圓桌騎士會被開除。

輸入

輸入有多組,每組第一行兩個整數,N和M,N為騎士的數量。

接下來M行每行兩個整數i,j,表示i與j之間仇恨。

輸入數據保證不會有重邊和自環。

0 0 代表輸入結束

?

輸出

一個整數,為所求的答案。

樣例輸入

5 51 21 32 32 43 50 0

樣例輸出

2

提示

1 ≤ n ≤ 1000 and 1 ≤ m ≤ 1000000

?

步驟:

1.先將沒有仇恨的騎士兩兩建邊。

2.求一遍雙連通分量。

3.在同一連通分量里面找奇環,若該連通分量存在奇環,則該連通分量的任意兩點都可以形成奇環。(下面有證明)

?

步驟三的證明:

1.首先明確:若存在奇環,則奇環上任意點必存在兩條路徑可以到達,而且長度必為一奇一偶。

2.所以如果再添加一個點或幾個的話,他們必與此環有聯通,且存在兩條路徑。

3.若單看這新添加的這幾個點或這一個點,他們之間一定存在一條路徑把他們連通,若該路徑為奇數,則可以和環上的偶數路徑搭配,構成奇環。反之,若為偶數,則可以和環上的奇數路徑搭配,構成奇環。所以無論如何都可以搭配成奇環。

?

下面是代碼:

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<algorithm>
  4 #include<cmath>
  5 #include<cstring>
  6 #include<vector>
  7 using namespace std;
  8  
  9 int gi()
 10 {
 11     int str=0;
 12     char ch=getchar();
 13     while(ch>'9'||ch<'0')ch=getchar();
 14     while(ch>='0' && ch<='9')str=str*10+ch-'0',ch=getchar();
 15     return str;
 16 }
 17 const int N=1001;
 18 int n,m;
 19 bool d[N][N];
 20 int num=0;
 21 struct Lin
 22 {
 23     int next,to;
 24 } a[N*N*2];
 25 int head[N];
 26 int ans=0;
 27 int color[N];
 28 bool c[N];
 29  
 30 void init(int x,int y)
 31 {
 32     a[++num].next=head[x];
 33     a[num].to=y;
 34     head[x]=num;
 35 }
 36 vector<int>q[N];
 37 int dfn[N],low[N],st[N],top=0,NUM=0,flg[N],bel[N],sum=0;
 38  
 39  
 40 void Clear()
 41 {
 42     memset(d,0,sizeof(d));
 43     for(int i=1; i<=N-1; i++)
 44     {
 45         dfn[i]=low[i]=flg[i]=bel[i]=color[i]=head[i]=st[i]=c[i]=0;
 46         q[i].clear();
 47     }
 48     num=NUM=top=ans=sum=0;
 49 }
 50  
 51 void dfs(int x,int last)
 52 {
 53     int u,v;
 54     dfn[x]=low[x]=++NUM;
 55     flg[x]=1;
 56     st[++top]=x;
 57     for(int i=head[x]; i; i=a[i].next)
 58     {
 59         u=a[i].to;
 60         if(u==last)continue;
 61         if(!dfn[u])
 62         {
 63             dfs(u,x);
 64             low[x]=min(low[x],low[u]);
 65             if(low[u]>=dfn[x])
 66             {
 67                 sum++;
 68                 while(top)
 69                 {
 70                     v=st[top--];
 71                     flg[v]=false;
 72                     bel[v]=sum;
 73                     q[sum].push_back(v);
 74                     if(v==u)break;
 75                 }
 76                 q[sum].push_back(x);
 77             }
 78         }
 79         else if(flg[u])low[x]=min(dfn[u],low[x]);
 80     }
 81 }
 82  
 83 bool Make(int x)
 84 {
 85     int u;
 86     for(int i=head[x]; i; i=a[i].next)
 87     {
 88         u=a[i].to;
 89         if(bel[u]!=bel[x])continue;
 90         if(color[u]==color[x])return false;
 91         if(!color[u])
 92         {
 93             color[u]=3-color[x];
 94             if(!Make(u))return false;
 95         }
 96     }
 97     return true;
 98 }
 99  
100 void work()
101 {
102     int x,y;
103     for(int i=1; i<=m; i++)
104     {
105         x=gi();
106         y=gi();
107         d[x][y]=d[y][x]=1;
108     }
109     for(int i=1; i<=n; i++)
110         for(int j=i+1; j<=n; j++)
111             if(!d[i][j])init(i,j),init(j,i);
112     for(int i=1; i<=n; i++)if(!dfn[i])dfs(i,i);
113 
114     bool ff=1;
115     int size;
116     ans=0;
117     for(int i=1; i<=sum; i++)
118     {
119         if(q[i].size()<=2)continue;
120         memset(color,0,sizeof(color));
121         color[q[i][0]]=1;
122         size=q[i].size();
123         for(int j=0;j<size;j++)bel[q[i][j]]=i;
124         ff=Make(q[i][0]);
125         if(!ff)for(int j=0;j<size;j++)c[q[i][j]]=1;
126     }
127     for(int i=1;i<=n;i++)if(!c[i])ans++;
128     printf("%d\n",ans);
129 }
130  
131 int main()
132 {
133     while(1)
134     {
135         n=gi();
136         m=gi();
137         if(!n && !m)break;
138         work();
139         Clear();
140     }
141     return 0;
142 }

?

轉載于:https://www.cnblogs.com/Yuzao/p/6750054.html

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

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

相關文章

微信小程序echarts層級太高

項目中因為需求&#xff0c;底部的tab導航欄是自己寫的&#xff0c;在開發者工具中一切正常&#xff1b;但是在真機上頁面滑動時&#xff0c;echarts的層級比tab高&#xff0c;調過兩者的z-index后仍然如此。 經過查找后發現cover-view和cover-image替換tab的view后&#xff0…

php解密 碼表,php拼音碼表的生成

php拼音碼表的生成發布于 2014-09-07 11:12:52 | 90 次閱讀 | 評論: 0 | 來源: 網友投遞PHP開源腳本語言PHP(外文名: Hypertext Preprocessor&#xff0c;中文名&#xff1a;“超文本預處理器”)是一種通用開源腳本語言。語法吸收了C語言、Java和Perl的特點&#xff0c;入門門檻…

angular js 使用pdf.js_排名靠前的幾個JS框架發展趨勢和前景

轉載自&#xff1a;葡萄城官網&#xff0c;葡萄城為開發者提供專業的開發工具、解決方案和服務&#xff0c;賦能開發者。原文出處&#xff1a;https://blog.bitsrc.io/top-5-javascript-frameworks-past-present-and-future-8b6fda39de02隨著信息技術領域的發展&#xff0c;企業…

工廠設計模式案例研究

我有一份工作來檢查我們的項目代碼質量。 如果我在項目中發現任何障礙&#xff0c;必須將其報告給我的團隊負責人。 我發現了很多漏洞&#xff0c;我認為可以在博客上進行討論。 不是嘲笑作者&#xff0c;而是一起學習和改進自己。 像這段代碼一樣&#xff0c;這是我在我們的代…

【javascript】DOM操作方法(3)——document節點屬性

document.doctype //document.documentElement //來獲取html元素 document.defaultView //返回document對象所在的window對象 document.body //返回當前文檔的<body>節點 document.head //返回當前文檔的<head>節點 document.activeElement //返回當前文…

debian dhcp服務啟動不了_DHCP服務器配置

DHCP &#xff1d; Dynamic Host Configuration Protocol 基于TCP/IP&#xff0c;用于動態配置工作站網絡接口&#xff0c;使工作站的網絡接口管理自動化。DHCP服務器軟件dhcpd網站&#xff1a;http://www.isc.org安裝方法&#xff1a;#tar -zxvf dhcp-4.0.0.tar.gz#cd dhcp-4.…

澤西島的JSON模式生成

因此&#xff0c;在上一篇文章中&#xff0c;我討論了一個允許在WADL中使用JSON-Schema的建議&#xff0c;這篇文章探討了如何使它與最近構建的Jersey一起使用。 在1.16發布之前&#xff0c;您將必須下載/參考1.16SNAPSHOT。 如果您使用的是Maven&#xff0c;那么假設您已經有…

C++map類型 之 簡單介紹

一&#xff1a;map的前世今生&#xff08;1&#xff09;從關聯容器與順序容器說起。關聯容器通過鍵&#xff08;key&#xff09;存儲和讀取元素。而順序容器則通過元素在容器中的位置順序存儲和訪問元素&#xff08;vector,queue,stack,list等&#xff09;。關聯容器&#xff0…

MySql Socket 完成數據庫的增查Demo

需求: 利用MySql數據庫結合前端技術完成用戶的注冊(要求不使用Web服務技術),所以 Demo采用Socket技術實現Web通信. 第一部分:數據庫創建 數據庫采用mysql 5.7.18, 數據庫名稱為MyUser, 內部有一張表 user.字段有 Id,UserName,Psd,Tel 第二部分:數據庫連接與Socket通信 創建控…

oracle導數卡死,oracle-審計導數

1、因審計需求&#xff0c;需要將MySQL、Oracle數據庫中需要的表數據導入到SqlSERVER進行審計。2、之前的方法&#xff1a;A. oracle組將表dump下來&#xff0c;進行壓縮&#xff0c;傳送到oracle導數服務器(中轉服務器)&#xff0c;再進行還原&#xff0c;然后修改表結構&…

蘋果桌面主題_看膩了手機自帶的桌面主題,試試這個

在這個看臉的時代&#xff0c;顏值似乎越來越重要了。尤其是我們每天都要看到的手機桌面&#xff0c;如果它的顏值好一點&#xff0c;也許我們的心情會更好&#xff0c;所以有不少人都用手機自帶的主題來美化桌面&#xff0c;但是對于喜歡個性的我們&#xff0c;手機自帶的主題…

Java SE 11:推動Java向前發展

介紹 在我看來&#xff0c;這篇文章提出了Java語言應該如何發展以保持其作為首選語言的地位。 它還提供了一些我喜歡但有時&#xff08;可能永遠不會&#xff09;成為Java一部分的功能&#xff0c;由于我將要解釋的某些原因&#xff0c;這些功能有時我已經愛上了。 我真的很想…

python之property屬性

Property的概念&#xff1a;property是一種特殊的屬性&#xff0c;訪問它時會執行一段功能&#xff08;函數&#xff09;&#xff0c;然后返回值。 import mathclass Circle:def __init__(self,radius):#園的半徑radiusself.radiusradiusproperty#areaproperty(area)def area(s…

Hexo使用細節及各種問題

解決markdown圖片不顯示(返回403 forbidden)、添加本地圖片無法顯示、修改文章page模板、同時部署發布同步到多個倉庫站點(Github、coding、gitee 碼云) 圖片不顯示 在使用過程中&#xff0c;會發現有的引用圖片無法顯示的問題。但是如果直接復制圖片地址到瀏覽器打開的話顯示…

oracle的等保,Oracle等保測評相關指令

Oracle用戶管理:SQL*Pluscreate user 用戶名 identified by 密碼; //創建用戶grant 權限(dba管理員&#xff0c;resource普通用戶&#xff0c;connect訪客) to 用戶名; //授權drop user 用戶名 cascade; //刪除用戶&#xff0c;加cascade會把用戶創建的所有東西刪除Linux設置用…

Spring3 + JPA2 + Java EE6 App Server =配置混亂

Spring很棒&#xff0c;JavaEE6很棒&#xff0c;最新的JavaEE6 Application服務器也很棒。 這篇文章不是Spring Vs JavaEE6上的專欄文章&#xff0c;而是我在JBoss AS-7.1 App Server上移植Spring3 JPA2&#xff08;Hibernate&#xff09;應用程序的經驗。 我的應用程序要求非…

python面向對象進階(1)

面向對象進階 isinstance(obj,cls) 檢查是否obj是類cls的對象class Foo(object): passobj Foo() isinstance(obj,Foo)issubclass(sub,super) 檢查sub是否是super的派生類class Foo(object): passclass Bar(Foo): passissubclass(Bar,Foo) 反射python面向對象中的反射&#xff…

智能小車37:異常在ARM、JAVA、硬件里的實現

幾乎所有編程語言都有異常&#xff0c;可以說有程序就有異常。今天學習Arm的中斷(異常)處理,聯想到Java的異常,硬件中如何實現等問題&#xff0c;下面給大家分享一下。 一、Arm的中斷。 1.觸發異常 2.保存現場 3.cpu進入異常工作模式&#xff0c;程序指針(pc)跳入異常入口&…

c++builder提高批量動態創建panel的速度_騎行時影響速度的事項有哪些 怎樣有效提高騎行速度 單車租賃信息...

撇開人的因素在自行車的組件中對車速影響最大的幾項是什么?車重?自鎖?輪組?傳動?我的個人感受&#xff0c;從提高幅度上來講&#xff0c;而不是重要性上來講一、自鎖起碼提高你50%的速度&#xff0c;我不用自鎖和別人一起走AVS25就很辛苦了&#xff0c;用了自鎖&#xff0…

ansys matlab 調用,matlab 調用ansys (轉載)

問題的提出&#xff1a;我們經常會需要用ansys計算一些東西&#xff0c;之后再用matlab來處理計算的結果。當修改某些參數重復上述過程的時候&#xff0c;就比較容易出現問題——比如ansys模型中的參數和matlab程序中參數的一致性問題等。這時可以考慮采用下面的協同工作的方法…