• [HNOI2010]PLANAR


    题目描述

    若能将无向图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,注意均为大写字母

    输入输出样例

    输入样例#1: 复制
    2
    6 9
    1 4
    1 5
    1 6
    2 4
    2 5
    2 6
    3 4
    3 5
    3 6
    1 4 2 5 3 6
    5 5
    1 2
    2 3
    3 4
    4 5
    5 1
    1 2 3 4 5
    输出样例#1: 复制
    YES
    懒得写了链接
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<cmath>
     6 using namespace std;
     7 struct Node
     8 {
     9   int next,to;
    10 }edge[100001];
    11 struct Edge
    12 {
    13   int u,v;
    14 }e[20001];
    15 int head[1001],num,n,m,id[1001],cnt;
    16 int vis[1001];
    17 void add(int u,int v)
    18 {
    19   num++;
    20   edge[num].next=head[u];
    21   head[u]=num;
    22   edge[num].to=v;
    23 }
    24 bool dfs(int x,int pa,int k)
    25 {int i;
    26   vis[x]=k^1;
    27   for (i=head[x];i;i=edge[i].next)
    28     {
    29       int v=edge[i].to;
    30       if (vis[v]==-1)
    31     {
    32       if (!dfs(v,x,k^1)) return 0;
    33     }
    34       else
    35     {
    36       if (vis[v]==(k^1))
    37         return 0;
    38     }
    39     }
    40   return 1;
    41 }
    42 int main()
    43 {int T,i,j,x;
    44   cin>>T;
    45   while (T--)
    46     {
    47       cin>>n>>m;
    48       for (i=1;i<=m;i++)
    49     {
    50       scanf("%d%d",&e[i].u,&e[i].v);
    51     }
    52       memset(id,0,sizeof(id));
    53       for (i=1;i<=n;i++)
    54     {
    55       scanf("%d",&x);
    56       id[x]=i;
    57     }
    58       if (m>3*n-6)
    59     {
    60       printf("NO
    ");
    61       continue;
    62     }
    63       num=0;
    64       memset(head,0,sizeof(head));
    65       for (i=1;i<=m;i++)
    66     {
    67       int u=e[i].u,v=e[i].v;
    68       if (id[u]>id[v]) swap(u,v);
    69       for (j=1;j<i;j++)
    70         {
    71           int p=e[j].u,q=e[j].v;
    72           if (id[p]>id[q]) swap(p,q);
    73           if (id[u]<id[p]&&id[v]<id[q]&&id[p]<id[v]) add(i,j),add(j,i);
    74           if (id[p]<id[u]&&id[q]<id[v]&&id[u]<id[q]) add(i,j),add(j,i);
    75         }
    76     }
    77       memset(vis,-1,sizeof(vis));
    78       for (i=1;i<=m;i++)
    79     if (vis[i]==-1)
    80     {
    81       if (!dfs(i,0,0)) break;
    82     }
    83       if (i>m) printf("YES
    ");
    84       else printf("NO
    ");
    85     }
    86 }
  • 相关阅读:
    Java基础01
    架构漫谈阅读笔记1
    机器学习-分类算法之k-近邻
    机器学习-模型选择
    机器学习-scikit-learn数据集
    机器学习-特征选择
    机器学习-数据的特征预处理
    实现模式阅读笔记二
    实现模式阅读笔记一
    《架构之美》阅读笔记七
  • 原文地址:https://www.cnblogs.com/Y-E-T-I/p/8551594.html
Copyright © 2020-2023  润新知