bzoj1997 Planar

来源:https://www.cnblogs.com/wxyww/archive/2019/04/29/bzoj1997.html
-Advertisement-
Play Games

思路 首先以那個環為框架,把所有的邊連出來。如果有兩條邊相交,那麼就把其中一條放到環外面去。 ...


題目鏈接

思路

首先以那個環為框架,把所有的邊連出來。如果有兩條邊相交,那麼就把其中一條放到環外面去。

如圖:

\((1,3)\)\((2,5)相交,\)(1,4)\(與\)(2,5)相交。所以我們把\((2,5)\)這條邊放到外面去。
就成了這樣

就不會有邊相交了。

顯然如果兩條邊在環內相交,那麼全部挪到環外也會相交。所以只要是相交的兩條邊必定是一個在環內,一個在環外。

然後就是2-sat模型了。

坑點。。。

犯了一些很zz的錯誤。
1.如果邊的數量>點的數量乘3-6,即\((m > n \times 3 - 6)\),可以證明必定無解。這個需要判斷掉。

2.沒錯,這個bug我調了很久233。。。

4.特判的地方要放到全部數據讀入之後。。。也調了很久(好zz啊啊啊)

代碼

/*
* @Author: wxyww
* @Date:   2019-04-27 19:06:04
* @Last Modified time: 2019-04-27 21:28:17
*/
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#include<ctime>
using namespace std;
typedef long long ll;
const int M = 300010;
#define pi pair<int,int>
ll read() {
    ll x=0,f=1;char c=getchar();
    while(c<'0'||c>'9') {
        if(c=='-') f=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9') {
        x=x*10+c-'0';
        c=getchar();
    }
    return x*f;
}
struct node {
    int v,nxt;
}e[M];
int head[M],ejs;
void add(int u,int v) {
    e[++ejs].v = v;e[ejs].nxt = head[u];head[u] = ejs;
}
int n,m,pos[M];
pi tmp[M];
bool pd(int l,int r,int L,int R) {
    if(l > r) swap(l,r);if(L > R) swap(L,R);
    if((l <= L && r >= R) || (L <= l && R >= r)) return 0;
    if(l >= R || L >= r) return 0;
    return 1;
}
int tot,vis[M],coljs,sta[M],col[M],top,dfn[M],low[M];
void tarjan(int u) {
    dfn[u] = low[u] = ++tot;
    sta[++top] = u;vis[u] = 1;
    for(int i = head[u];i;i = e[i].nxt) {
        int v = e[i].v;
        if(!dfn[v]) {
            tarjan(v);
            low[u] = min(low[u],low[v]);
        }
        else if(vis[v]) low[u] = min(low[u],low[v]);
    }
    if(low[u] == dfn[u]) {
        ++coljs;
        do {
            int x = sta[top--];
            col[x] = coljs;
            vis[x] = 0;
        }while(sta[top + 1] != u);
    }
}
int main() {
    int T = read();
    while(T--) {
        memset(head,0,sizeof(head));
        ejs = 0;
        memset(pos,0,sizeof(pos));
        coljs = 0;memset(col,0,sizeof(col));
        memset(dfn,0,sizeof(dfn));memset(low,0,sizeof(low));
        tot = 0;top = 0;

        n = read(),m = read();
        for(int i = 1;i <= m;++i) tmp[i].first = read(),tmp[i].second = read();
        for(int i = 1;i <= n;++i) pos[read()] = i;
        if(m > 3 * n - 6) {
            puts("NO");continue;
        }
        for(int i = 1;i <= m;++i)
            for(int j = i + 1;j <= m;++j)
                if(pd(pos[tmp[i].first],pos[tmp[i].second],pos[tmp[j].first],pos[tmp[j].second]))
                    add(i,j + m),add(i + m,j),add(j,i + m),add(j + m,i);
        for(int i = 1;i <= m + m;++i) if(!dfn[i]) tarjan(i);
        int bz = 0;
        for(int i = 1;i <= m;++i) if(col[i] == col[i + m]) bz = 1;
        if(bz) puts("NO");else puts("YES");
    }

    return 0;
}

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

-Advertisement-
Play Games
更多相關文章
  • 在前端學習過程中,涉及到路徑的問題非常多,相對路徑,絕對路徑等。有時候明明覺得沒問題,但是還是會出錯。或者說線下沒問題,但是到了線上就出現問題,因此弄懂路徑問題,非常關鍵。我們需要知道為什麼這個地方既可以使用相對路徑,又可以使用絕對路徑,為什麼有些地方只能使用絕對路徑。 一、Node.js中載入模塊 ...
  • 實驗環境:docker + openresty 我限制的5秒鐘內允許訪問兩次效果圖: default.conf 代碼如下: ...
  • 一、封裝 封裝:是面向對象方法的重要原則,就是把對象的屬性和行為(數據)結合為一個獨立的整體,並儘可能隱藏對象的內部實現細節,就是把不想告訴或者不該告訴別人的東西隱藏起來,把可以告訴別人的公開,別人只能用我提供的功能實現需求,而不知道是如何實現的。增加安全性 以上 Person 類封裝 name、g ...
  • 文章首發: "結構型模式:裝飾模式" 七大結構型模式之四:裝飾模式。 簡介 姓名 :裝飾模式 英文名 :Decorator Pattern 價值觀 :人靠衣裝,類靠裝飾 個人介紹 : Attach additional responsibilities to an object dynamicall ...
  • 這幾天在家,複習了了一下 Java SE ,到面向對象那邊找了個簡單數組項目做了一下,還是有收穫的。 只為記錄,好記性不如爛筆頭 有誤請指正 ありがとうございます。 我的公眾號 作者:晨鐘暮鼓c個人微信公眾號:程式猿的月光寶盒 1.首先,項目是客戶信息管理系統,需求如下: 2.涉及知識點 Ø 類結構 ...
  • 鑒於最近跟小伙伴聊了很多PHP架構發展方向的問題,相關技術整理了一下,也順便規划了一下自己的2019年。 一.常用的設計模式以及使用場景 以下是我用到過的 工廠,單例,策略,註冊,適配,觀察者,原型,裝飾器,facade,loc,pipeline 二.閱讀一個框架源碼 例如:laravel 三.常用 ...
  • 1.1 你是如何認識新事物的? 一般而言,從過往的見多的事物中,總結->推斷->所屬類別->認知行為。 1.2 類(Class)的概念 類是對一組具有共同特征和行為的對象的抽象描述。 理解 [1]類是專門用於描述現實生活中的事物的。 [2]類描述的事物都具有共同的特征和行為。 [3]類就是我們通常所 ...
  • 本人是做java web開發的,已經工作兩年了。一直都是自己學習學技術,昨天突然靈光一現,覺得自己應該有一個自己的博客。以後我會不定時的在博客上更新一些自己學習掌握的技術。以前都沒有過這樣書面性的給別人講解技術的經驗,可能有什麼寫的不到位的地方,請大家能夠給我指出來說明一下,我會加以改正。大家一起努 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...