1013 这个题中用到stackst 需要学习

这里标记下是否还有没访问过的点,如果有,则说明需要+1条路

#include <stdio.h>
#include <string.h>
#include <stack>
using namespace std;
class A
{
public:
 enum{N=1010};
 void init();
 void run();
private:
 int checklinkmap(int ic);
 int n,m,k;
 bool map[N][N];
};

void A::init()
{
 memset(map,0,sizeof(bool)*N*N);
 int i,r1,r2;
 scanf("%d%d%d",&n,&m,&k);
 for(i=0;i<m;i++)
 {
  scanf("%d%d",&r1,&r2);
  map[r1][r2]=true;
  map[r2][r1]=true;
 }
}

void A::run()
{
 int i,ic,addarc;
 for(i=0;i<k;i++)
 {
  scanf("%d",&ic);
  addarc=checklinkmap(ic);
  printf("%d\n",addarc);
 }
}

int A::checklinkmap(int ic)
{
 int i,rc,addarc=0;
 bool visit[N],blink;
 stack<int> st;
 for(i=1;i<=n;i++) visit[i] =false;
 visit[ic]=true;
 rc=ic==1?2:1;
 visit[rc]=true;
 st.push(rc);
 while(true)
 {
  while(!st.empty())
  {
   rc=st.top();
   st.pop();
   for(i=1;i<=n;i++)
   {
    if(visit[i]) continue;
    if(map[rc][i]){visit[i]=true;st.push(i);}
   }
  }
  blink=true;
  for(i=1;i<=n;i++)
  {
   if(!visit[i]) {blink=false;break;}
  }
  if(blink) break;
  addarc++;
  visit[i]=true;
  st.push(i);
 }
 return addarc;
}
int main()
{
// freopen("test.in","r",stdin);
 A *a=new A;
 a->init();
 a->run();
 return 0;
}