#include #include void setData(int); int main() { int n; scanf("%d",&n); while(n!=0){ setData(n); scanf("%d",&n); } } void setData(int n){ std::set rings[101];//リングのつながりを確保 std::set parts;//出てきた番号を保持 int a,b; for(int i=0;i > memo[101];//紐のメモ化探索、たどってきた番号を保存 std::set add;//最初に一つだけの番号の鎖を作る std::set::iterator it=parts.begin(); while(it!=parts.end()){ add.insert(*it); memo[(*it)].insert(add); add.clear(); it++; } std::set >::iterator memoIt;//メモ化探索で一つ先を調べる std::set::iterator comIt;//リングの結合をたどる int count; int allCount=1; unsigned int ans=1; while(allCount>0) { allCount=0; it=parts.begin();//点を順番に取得 while(it!=parts.end()) { memoIt=memo[(*it)].begin();//点に記録してある、今までの経路のメモ化を読み取る while((*memoIt).size()>0) { comIt=rings[(*it)].begin();//次に移動する点を選ぶ count=0; while(comIt!=rings[*it].end()){ if((*memoIt).find(*comIt)==(*memoIt).end()){ (*memoIt).insert(*comIt); memo[*comIt].insert(*memoIt); ans=(*memoIt).size()>ans?(*memoIt).size():ans; (*memoIt).erase(*comIt); count++; } comIt++; } if(count>0){ memo[*it].erase(*memoIt);//もしも次に移動する点が一つ以上あるならこの点のメモ化は用済みなので削除する } if(memoIt==memo[*it].end()) break; allCount+=count; memoIt++; } it++; } } printf("%u\n",ans); }