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
随性Code