生活随笔
收集整理的這篇文章主要介紹了
bzoj 1997: [Hnoi2010]Planar
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Description
若能將無向圖 G=(V,E)畫在平面上使得任意兩條無重合頂點的邊不相交,則稱 G 是平面圖。
判定一個圖是否為平面圖的問題是圖論中的一個重要問題。現在假設你要判定的是一類特殊的
圖,圖中存在一個包含所有頂點的環,即存在哈密頓回路。
輸入格式:
輸入文件的第一行是一個正整數T,表示數據組數(每組數據描述一個需要判定的圖)。接下來從輸入文件第二行開始有T組數據,每組數據的第一行是用空格隔開的兩個正整數N和M,分別表示對應圖的頂點數和邊數。緊接著的M行,每行是用空格隔開的兩個正整數u和v(1<=u,v<=n),表示對應圖的一條邊(u,v),輸入的數據保證所有邊僅出現一次。每組數據的最后一行是用空格隔開的N個正整數,從左到右表示對應圖中的一個哈密頓回路:V1,V2,…,VN,即對任意i≠j有Vi≠Vj且對任意1<=i<=n-1有(Vi,Vi-1) ∈E及(V1,Vn) ∈E。輸入的數據保證100%的數據滿足T<=100,3<=N<=200,M<=10000。
輸出格式:
包含T行,若輸入文件的第i組數據所對應圖是平面圖,則在第i行輸出YES,否則在第i行輸出NO,注意均為大寫字母
solution
正解:二分圖染色
很容易想到聽大佬們說是二分圖,然后去分析性質,發現唯一解決矛盾的方法是:
把相交的兩條邊的其中一條放到環外面去,然后發現都放出去也會相交,于是就產生了兩個集合
二分圖染色判斷即可,但是邊數是 \(m=10000\),開不下啊,看了題解,發現有結論:平面圖邊數不超過 \(3*n-6\),于是判掉后,邊就少了.
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#define RG register
#define il inline
#define iter iterator
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
const int N=605,M=605*605*2;
int n,m,a[N],nxt[M],to[M],num=0,head[N],id[N],col[N],flag=0;
struct node{int x,y;}e[10005];
inline void link(int x,int y){nxt[++num]=head[x];to[num]=y;head[x]=num;}
void Clear(){memset(head,0,sizeof(head));num=0;memset(col,0,sizeof(col));flag=1;
}
inline void dfs(int x){for(int i=head[x];i;i=nxt[i]){int u=to[i];if(!col[u]){col[u]=3-col[x];dfs(u);}else if(col[u]==col[x]){flag=0;return ;}if(!flag)return ;}
}
void work()
{Clear();int x1,y1,x2,y2;scanf("%d%d",&n,&m);for(int i=1;i<=m;i++)scanf("%d%d",&e[i].x,&e[i].y);for(int i=1;i<=n;i++)scanf("%d",&a[i]),id[a[i]]=i;if(m>3*n-6){puts("NO");return ;}for(int i=1;i<=m;i++){for(int j=i+1;j<=m;j++){x1=id[e[i].x];y1=id[e[i].y];x2=id[e[j].x];y2=id[e[j].y];if(x1==x2 || x1==y2 || y1==x2 || y1==y2)continue;if(x1>y1)swap(x1,y1);if(x2>y2)swap(x2,y2);if(x1>x2)swap(x1,x2),swap(y1,y2);if(x1<x2 && x2<y1 && y2>y1)link(i,j),link(j,i);}}for(int i=1;i<=m;i++){if(col[i])continue;col[i]=1;dfs(i);if(!flag){puts("NO");return ;}}puts("YES");
}int main()
{int T;cin>>T;while(T--)work();return 0;
}
轉載于:https://www.cnblogs.com/Yuzao/p/7967092.html
總結
以上是生活随笔為你收集整理的bzoj 1997: [Hnoi2010]Planar的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。