每次选择一个有3个wake的邻节点的节点,标记为wake,将其计数器减清零,并且将这个节点的所有没醒着的邻节点计数器加一
#include <iostream>
#include <map>
#include <vector>
#include <cstdio>
#include <cstring>
#include <memory.h>
using namespace std;
#define MAX 130
map<int,map<int,int> >g;
char awaked[10];
int cnt[MAX],n,m;
bool wake[MAX];
int main(){
while(scanf("%d",&n)==1){
scanf("%d",&m);
int ccnt=n-3,ans=0,f=1;
memset(cnt,0,sizeof(cnt));
memset(wake,0,sizeof(wake));
g.clear();
scanf("%s",awaked);
for(int i=0;i<m;++i){
char buf[5];
scanf("%s",buf);
g[buf[0]][buf[1]]=g[buf[1]][buf[0]]=1;
}
for(int i=0;i<3;++i){
map<int,int>::iterator it=g[awaked[i]].begin();
wake[awaked[i]]=1;
for(;it!=g[awaked[i]].end();++it){
if(!wake[it->first])
cnt[it->first]++;
}
}
while(ccnt>0){
int flag=0;
map<int,map<int,int> >::iterator it=g.begin();
vector<int>v;
for(;it!=g.end();++it){
if(cnt[it->first]>=3){
v.push_back(it->first);
flag=1;
cnt[it->first]=0;
ccnt--;
}
}
if(flag==0){
f=0;
break;
}
for(int i=0;i<v.size();++i){
map<int,int>::iterator it=g[v[i]].begin();
for(;it!=g[v[i]].end();++it){
if(!wake[it->first])
cnt[it->first]++;
}
}
ans++;
}
if(f)printf("WAKE UP IN, %d, YEARS\n",ans);
else printf("THIS BRAIN NEVER WAKES UP\n");
}
return 0;
}