日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

bzoj 1997: [Hnoi2010]Planar

發布時間:2024/8/26 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。