https://uva.onlinejudge.org/external/3/336.pdf
#include<iostream>
#include<queue>
#include<algorithm>
#include<map>
#include<string.h>
#include<math.h>
#include<stdio.h>
#include <iomanip>
#include <stack>
#include <vector>
#include <sstream>
using namespace std;
map<int,int>used;
map<int,vector<int>>martix;
map<int,int>::iterator it;
void BFS(int start,map<int,vector<int>>martix);//遍历起点可到达的点以及到各点的操作数
int main()
{
int cas = 1;
int i,j;
int num_of_network_connections;
while(scanf("%d",&num_of_network_connections)==1 && num_of_network_connections)
{
int node_a,node_b;
martix.clear();
for(i=0;i<num_of_network_connections;i++)
{
scanf("%d%d",&node_a,&node_b);
martix[node_a].push_back(node_b);
martix[node_b].push_back(node_a);
}
//query following
int start,len;
while(scanf("%d %d",&start,&len)==2 && (start || len))
{
int too_long_to_reach = 0;
used.clear();
BFS(start,martix);
for(it=used.begin();it!=used.end();it++)
{
if((*it).second>len)
too_long_to_reach++;
}
unsigned long unable_to_reach= martix.size()-used.size();
unable_to_reach+=too_long_to_reach;
cout<<"Case "<<cas<<": "<<unable_to_reach<<" nodes not reachable from node "<<start<<" with TTL = "<<len<<"."<<endl;
cas++;
}
}
return 0;
}
void BFS(int start,map<int,vector<int>>martix)
{
queue<int>temp;
temp.push(start);
used[start] = 0;
while(!temp.empty())
{
int pre = temp.front();
temp.pop();
unsigned long Size = martix[pre].size();
for(int i=0;i<Size;i++)
{
int n= martix[pre][i];
if(!used.count(n)) //used[]中存在键值n
{
used[n] = used[pre]+1;
temp.push(n);
}
}
}
}