zoukankan      html  css  js  c++  java
  • topcoder 650 srm div2 1000pts

    (15)

          也是 DIV1 500

    题意是给定 一个无向图 删去一条边以后 可不可以是完全二叉树。

    细节点很多,开始做法居然求到桥去了,最近强联通写傻了。

    最多1024-1个点 1024-1条边枚举

    所以:

         先枚举要删去的边,然后进行判断。

    判断是否是一颗完全二叉树的话 要一个标记deep深度 max deep==h

    然后还要看是否整个图强联通

    还有一点 点的度 为1 ,2 ,3 其中度为2的只有一个 ,度为1的有2^(h-2)个

    code:

     1 #include<iostream>
     2 #include <string>
     3 #include <vector>
     4 #include<cmath>
     5 #include<map>
     6 #include<algorithm>
     7 #include<string.h>
     8 using namespace std;
     9 #define N 123456
    10 
    11 int head[N],dfn[N],low[N];
    12 int vis[N];
    13 int du[N];
    14 struct edge
    15 {
    16     int v,next;
    17 }e[N*10];
    18 int cnt;
    19 
    20 int ans;
    21 
    22 void add(int u,int v)
    23 {
    24     e[cnt].v=v;
    25     e[cnt].next=head[u];
    26     head[u]=cnt++;
    27 }
    28 
    29 
    30 void dfs(int u,int t)
    31 {
    32     vis[u]=1;
    33     t++;
    34     ans=max(ans,t);
    35     for (int i=head[u];i!=-1;i=e[i].next)
    36     {
    37         int v=e[i].v;
    38         if (!vis[v])
    39         {
    40             dfs(v,t);
    41         }
    42     }
    43 }
    44 
    45 void init()
    46 {
    47     cnt=0;
    48     memset(head,-1,sizeof(head));
    49     memset(dfn,0,sizeof(dfn));
    50     memset(low,0,sizeof(low));
    51     memset(vis,0,sizeof(vis));
    52     memset(du,0,sizeof(du));
    53     ans=0;
    54 }
    55 
    56 class TheKingsRoadsDiv2 {
    57     public:
    58     string getAnswer(int h, vector <int> a, vector <int> b) {
    59     int  k=1;
    60     for (int i=1;i<=h;i++) k*=2;
    61     k--;
    62 
    63     for (int p=0;p<a.size();p++)
    64     {
    65     init();
    66     for (int j=0;j<a.size();j++)
    67     if (j!=p)
    68     {
    69     add(a[j],b[j]),add(b[j],a[j]);
    70     du[a[j]]++;
    71     du[b[j]]++;
    72     }
    73 
    74     int u=0;
    75     int num=0;
    76     int flag=0;
    77     for (int i=1;i<=k;i++) {
    78     if (du[i]==2) u=i;
    79     else if (du[i]==1) num++;
    80     else if (!(du[i]==1||du[i]==2||du[i]==3)) flag=1;
    81     }
    82 
    83     if (!u||num!=(k+1)/2) continue;
    84     dfs(u,0);
    85     for (int i=1;i<=k;i++)
    86     if (!vis[i]) flag=1;
    87     if (flag||ans!=h) continue;
    88     return "Correct";
    89     }
    90     return "Incorrect";
    91    }
    92 };
    93 
    94 
    95 // Powered by FileEdit
    96 // Powered by TZTester 1.01 [25-Feb-2003]
    97 // Powered by CodeProcessor
  • 相关阅读:
    DDL
    [笔记]NFC笔记——初始化RF碰撞避免
    [笔记]Java没有C语言的编译开关怎么办?
    [笔记]NFC笔记——通用初始化及单设备检测(SDD)流程
    [笔记]NFC笔记——NFCIP1协议命令集(NFCIP1 Protocol Command Set)
    [笔记]C++代码演示SingletonMap 单类Map实例
    [笔记]NFC笔记——传输帧格式
    [笔记]C++代码演示Singleton单类实例
    [笔记]山寨中文编程语言
    [笔记]NFC笔记——ATR_REQ 消息结构
  • 原文地址:https://www.cnblogs.com/forgot93/p/4296273.html
Copyright © 2011-2022 走看看