题意:
给出点的个数及各个点之间的联通情况,输出从某点开始沿联通图路线走n步后不能到达的点的个数,0 0结束
思路:
用bfs搜索每个点
#include <iostream>
#include <map>
#include <queue>
#include <vector>
using namespace std;
//int vis[1000];
int N,T,cnt;
map<int,vector<int>> connect;//储存每个点的值及与其联通的点的值,map.size()的值即为与该点相连的点的个数
void initial()
{
connect.clear();//清空map
}
void read()
{
int k,j;
for(int i=0;i<N;i++)
{
cin>>k>>j;
connect[k].push_back(j);
connect[j].push_back(k);
}
}
void bfs(int n)
{
map<int,int> vis;//记录到达该点的步数
queue<int> node;
cnt=connect.size();//记录达不到的点的个数,初始化为最开始所有点的个数
//cout<<cnt<<endl;
int m,k;
vis[n]=0;//起始点步数记为0
node.push(n);//添加到队列中
while(!node.empty())//队列不为空
{
k=node.front();//取出第一个点
node.pop();
cnt--;//能达到,则cnt减1
if(vis[k]<T)//到达该点的步数小于规定的步数
{
for(int i=0;i<connect[k].size();i++)//循环搜索与该点相连的各个点
{
m=connect[k][i];
if(vis.count(m)==0)//未被访问过
{
vis[m]=vis[k]+1;//步数增加
node.push(m);//加入队列
}
}
}
}
}
int main()
{
int n,c=0;
while(cin>>N&&N)
{
initial();
read();
while(cin>>n>>T)
{
if(n==0&&T==0)
break;
c++;
bfs(n);
cout<<"Case "<<c<<": "<<cnt<<" nodes not reachable from node "<<n<<" with TTL = "<<T<<"."<<endl;
}
}
return 0;
}