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

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

bzoj 1997: [Hnoi2010]Planar

發(fā)布時(shí)間:2024/8/26 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bzoj 1997: [Hnoi2010]Planar 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Description

若能將無(wú)向圖 G=(V,E)畫(huà)在平面上使得任意兩條無(wú)重合頂點(diǎn)的邊不相交,則稱(chēng) G 是平面圖。
判定一個(gè)圖是否為平面圖的問(wèn)題是圖論中的一個(gè)重要問(wèn)題。現(xiàn)在假設(shè)你要判定的是一類(lèi)特殊的
圖,圖中存在一個(gè)包含所有頂點(diǎn)的環(huán),即存在哈密頓回路。
輸入格式:
輸入文件的第一行是一個(gè)正整數(shù)T,表示數(shù)據(jù)組數(shù)(每組數(shù)據(jù)描述一個(gè)需要判定的圖)。接下來(lái)從輸入文件第二行開(kāi)始有T組數(shù)據(jù),每組數(shù)據(jù)的第一行是用空格隔開(kāi)的兩個(gè)正整數(shù)N和M,分別表示對(duì)應(yīng)圖的頂點(diǎn)數(shù)和邊數(shù)。緊接著的M行,每行是用空格隔開(kāi)的兩個(gè)正整數(shù)u和v(1<=u,v<=n),表示對(duì)應(yīng)圖的一條邊(u,v),輸入的數(shù)據(jù)保證所有邊僅出現(xiàn)一次。每組數(shù)據(jù)的最后一行是用空格隔開(kāi)的N個(gè)正整數(shù),從左到右表示對(duì)應(yīng)圖中的一個(gè)哈密頓回路:V1,V2,…,VN,即對(duì)任意i≠j有Vi≠Vj且對(duì)任意1<=i<=n-1有(Vi,Vi-1) ∈E及(V1,Vn) ∈E。輸入的數(shù)據(jù)保證100%的數(shù)據(jù)滿(mǎn)足T<=100,3<=N<=200,M<=10000。
輸出格式:
包含T行,若輸入文件的第i組數(shù)據(jù)所對(duì)應(yīng)圖是平面圖,則在第i行輸出YES,否則在第i行輸出NO,注意均為大寫(xiě)字母

solution

正解:二分圖染色
很容易想到聽(tīng)大佬們說(shuō)是二分圖,然后去分析性質(zhì),發(fā)現(xiàn)唯一解決矛盾的方法是:
把相交的兩條邊的其中一條放到環(huán)外面去,然后發(fā)現(xiàn)都放出去也會(huì)相交,于是就產(chǎn)生了兩個(gè)集合
二分圖染色判斷即可,但是邊數(shù)是 \(m=10000\),開(kāi)不下啊,看了題解,發(fā)現(xiàn)有結(jié)論:平面圖邊數(shù)不超過(guò) \(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; }

轉(zhuǎn)載于:https://www.cnblogs.com/Yuzao/p/7967092.html

總結(jié)

以上是生活随笔為你收集整理的bzoj 1997: [Hnoi2010]Planar的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。