【做題筆記】P1330 封鎖陽光大學

来源:https://www.cnblogs.com/Nicest1919/archive/2020/02/14/12309303.html
-Advertisement-
Play Games

讀題易得:對於有邊的兩個點 $u,v$ ,能且僅能其中一點對這條邊進行封鎖。 什麼意思呢?假設給這張圖上的點進行染色,那麼對於上述的兩個點 $u,v$ , $u,v$ 必須異色 (理解這一點很重要)。 那麼,也就是說,在這張圖上,如果要把這張圖“完全封鎖”且兩隻河蟹不能封鎖相鄰的兩個點,換而言之,把 ...


讀題易得:對於有邊的兩個點 \(u,v\) ,能且僅能其中一點對這條邊進行封鎖。

什麼意思呢?假設給這張圖上的點進行染色,那麼對於上述的兩個點 \(u,v\)\(u,v\) 必須異色(理解這一點很重要)。

那麼,也就是說,在這張圖上,如果要把這張圖“完全封鎖”且兩隻河蟹不能封鎖相鄰的兩個點,換而言之,把連接一條邊的兩個點染色,這兩個點是異色的,那麼整張圖上無非也就這兩種顏色,答案無非也就是這兩種顏色中數目較少那一種的數目。

註意到存在無解的情況,那麼是麽時候無解呢?想一下,遍歷這張圖,那麼肯定會遇到做過的點。把我們自己想成河蟹,那麼重覆來到這時相當於給這個點重新染色。 如果我們攜帶的“顏料”和上一隻河蟹是一樣的,那麼相當於什麼都不做;但如果不同,相當於對這個點重新封鎖,這就產生了衝突。所以,這時不合法,返回 0 。否則返回 1 。

請註意:這個圖可能不是聯通的,所以需要設 vis 數組,判斷某個點有沒有用過,去遍歷所有的小連通圖。

參考代碼:

#include <iostream>
#include <cstdio>
#include <cmath>

using namespace std;

int n,m,vis[4000010],c[3],head[4000010],tot,_color[4000010];
//_color[u]代表第 u 個點的顏色
//c[]記錄兩種顏色的數量
struct node
{
    int to,nxt;
};
node G[400010];

inline int read()
{
    int s=0,w=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
    while(ch>='0'&&ch<='9')s=s*10+ch-'0',ch=getchar();
    return s*w;
}

inline void add(int u,int v)
{
    G[++tot]=(node){v,head[u]},head[u]=tot;
    G[++tot]=(node){u,head[v]},head[v]=tot;
}

int dfs(int u,int cor)
{
    if(vis[u])
    {
        if(_color[u]==cor)return 1;
        return 0;
    }
    vis[u]=1;
    c[_color[u]=cor]++;
    int can_do=1;
    for(int i=head[u];i&&can_do;i=G[i].nxt)can_do=can_do&&dfs(G[i].to,1-cor);
    return can_do;
}

int main()
{
    int ans;
    n=read(),m=read();
    for(int i=1;i<=m;i++){int u=read(),v=read();add(u,v);}
    for(int i=1;i<=n;i++)
    {
        if(vis[i])continue;
        c[0]=c[1]=0;
        if(dfs(i,0)==0){cout<<"Impossible"<<endl;return 0;}
        ans+=min(c[0],c[1]); //註意,這裡是加上
    }
    cout<<ans<<endl;
    return 0;
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今日內容 複習 內容詳細 1.Python入門 1.1 環境的搭建 mac系統上搭建python環境。 環境變數的作用:方便在命令行(終端)執行可執行程式,將可執行程式所在的目錄添加到環境變數,那麼以後無需再輸入路徑。 1.2 變數命名 變數 全局變數 函數 常量 1.3 運算符 is和==的區別? ...
  • 什麼是數據結構? 線性表 數組 動態數組設計 項目結構 代碼實現 CybArrayList.java package com.cyb; /** * 自定義ArrayList數組 * * @author chenyanbin * */ public class CybArrayList { /** * ...
  • 詳細代碼在文章底部 目錄 "基礎概念" "進程與線程" "單線程與多線程" "實現線程的4中方式" "thread.start()和runnable.run()的區別" 和runnable.run()的區別) "Thread和Runnable的異同" "線程的基本操作" "線程的優先順序與守護線程" ...
  • 建議使用format()方法 字元串操作 對於 , 官方以及給出這種格式化操作已經過時,在 的未來版本中可能會消失。 在新代碼中使用新的字元串格式。因此推薦大家使用 來替換 %. format 方法系統複雜變數替換和格式化的能力,因此接下來看看都有哪些用法。 format() 這個方法是來自 模塊的 ...
  • 在使用Eclipse過程中可能想更換下界面主題,此處介紹的是一款主題插件 Eclipse Color Theme 打開Eclipse,Help --> Eclipse Marketplace 在打開的視窗中 搜索 theme 在搜索結果中選擇 Eclipse Color Theme 並安裝,安裝過程 ...
  • 史上最水的 dp 題,沒有之一(By rxz) 確實很簡單,就算是我這個 dp 萌新也一眼看出來了轉移方程 首先考慮狀態,設 $f_{i,j}$ 表示選擇第 $i$ 層第 $j$ 個數時獲得的最大值,那麼可以發現,對於數字 $a_{i,j}$ ,只有從 $a_{i 1,j}$ 和 $a_{i 1,j ...
  • 數轉換成二叉樹:使用孩子兄弟表示法。 二叉樹轉換成樹:將二叉樹的右孩子轉換成兄弟。 森林轉換成二叉樹:將森林中的每一棵樹都轉換成二叉樹,然後把森林中每個結點連起來,調整角度,使其成為二叉樹形狀。 二叉樹轉換成森林:將二叉樹分成n個互不相交、沒有右子樹的二叉樹,然後將每個二叉樹都轉換成樹。 ...
  • 題目大意:給定 $n$ 個數,每次可以 任意 選兩個數 $a_i,a_j$ 相加,把相加的結果作為一個新數繼續執行此操作,直到只剩一個數為止。現要求使最後得出的這個數最小。 一個顯然的貪心策略:每次選最小的兩個數相加,得到一個新數,然後繼續。但是,如果按照這樣的思路,那麼每次得到新數後這個序列的 單 ...
一周排行
    -Advertisement-
    Play Games
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...