Submission #18673

#TimeUsernameProblemLanguageResultExecution timeMemory
18673suhgyuho_williamParachute rings (IOI12_rings)C++98
20 / 100
4025 ms63236 KiB
#include <vector> #include <stdio.h> #include <queue> using namespace std; int N; vector<int> edge[1000010]; bool check[1000010],flag; int q[1000010],top,rear; int jj; void dfs2(int x,int par){ int i,v,cnt = 0; check[x] = true; for(i=0; i<edge[x].size(); i++){ v = edge[x][i]; if(v == par || v == jj) continue; if(check[v]){ flag = false; continue; } dfs2(v,x); cnt++; } if(cnt >= 2) flag = false; } int checking(int x){ int i,t,v; jj = x; for(i=1; i<=N; i++) check[i] = false; flag = true; check[jj] = true; for(i=1; i<=N; i++){ if(!check[i]){ t = 0; for(int k=0; k<edge[i].size(); k++){ v = edge[i][k]; if(v == jj) continue; t++; if(t == 3){ flag = false; break; } dfs2(v,i); } } if(!flag) break; } if(flag) return 1; else return 0; } void Init(int N_) { N = N_; } void Link(int A, int B) { A++; B++; edge[A].push_back(B); edge[B].push_back(A); } int problem; void dfs(int x,int par){ int i,v,cnt = 0; check[x] = true; for(i=0; i<edge[x].size(); i++){ v = edge[x][i]; if(v == par) continue; if(check[v]){ flag = false; if(problem == -1) problem = x; continue; } dfs(v,x); cnt++; } if(cnt >= 2){ flag = false; if(problem == -1) problem = x; } } int ischain(int x){ int i,t; check[x] = true; t = 0; flag = true; for(i=0; i<edge[x].size(); i++){ t++; if(!check[edge[x][i]]) dfs(edge[x][i],x); } if(t >= 3){ flag = false; } if(flag) return 0; // chain else return 1; } int CountCritical() { int i,j,cnt,s,v; int ans = 0; cnt = 0; for(i=1; i<=N; i++) check[i] = false; for(i=1; i<=N; i++){ if(!check[i]){ if(ischain(i) == 1){ cnt++; s = i; } } } if(cnt >= 2) return 0; if(cnt == 0) return N; for(i=1; i<=N; i++) check[i] = false; cnt = edge[s].size(); if(cnt > 3){ ans += checking(s); return ans; }else if(cnt == 3){ ans += checking(s); for(i=0; i<edge[s].size(); i++){ v = edge[s][i]; ans += checking(v); } return ans; }else{ problem = -1; i = ischain(s); s = problem; //printf("problem : %d\n",problem-1); ans += checking(s); if(edge[s].size() > 3) return ans; for(i=0; i<edge[s].size(); i++){ v = edge[s][i]; ans += checking(v); } } ans = 0; for(i=1; i<=N; i++) ans += checking(i); return ans; }

Compilation message (stderr)

rings.cpp: In function 'void dfs2(int, int)':
rings.cpp:17:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(i=0; i<edge[x].size(); i++){
              ~^~~~~~~~~~~~~~~
rings.cpp: In function 'int checking(int)':
rings.cpp:36:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for(int k=0; k<edge[i].size(); k++){
                 ~^~~~~~~~~~~~~~~
rings.cpp: In function 'void dfs(int, int)':
rings.cpp:68:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(i=0; i<edge[x].size(); i++){
              ~^~~~~~~~~~~~~~~
rings.cpp: In function 'int ischain(int)':
rings.cpp:88:12: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(i=0; i<edge[x].size(); i++){
           ~^~~~~~~~~~~~~~~
rings.cpp: In function 'int CountCritical()':
rings.cpp:122:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(i=0; i<edge[s].size(); i++){
                  ~^~~~~~~~~~~~~~~
rings.cpp:134:13: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(i=0; i<edge[s].size(); i++){
            ~^~~~~~~~~~~~~~~
rings.cpp:100:8: warning: unused variable 'j' [-Wunused-variable]
  int i,j,cnt,s,v;
        ^
rings.cpp:129:5: warning: 's' may be used uninitialized in this function [-Wmaybe-uninitialized]
   i = ischain(s);
   ~~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...