题目大意:
对于一组结点,根据起始点和能走的步数算出到达不了的结点数。
有很多组数据以EOF结束。
输入:
输进NC表示后续数据对数,然后输进NC对相连结点。(结点个数不超过30)
再输进查询的起始点和最多走的步数,两个0表示结束。
输出:
对应到不了的点数,格式按题目来就行。
出现的问题:试图用二维vector来搞,失败是因为,虽然结点数不超过30,但是结点上的数会超…………所以要用map来搞。一个结点对应一个vector数组,也不会有浪费的空间。
还好老朱讲这题的时候提了下map不然我会僵着怕是要狗带啦。
本小机智第一次一天AK哦哈哈哈哈哈
唉感冒好不了了晚上睡不着白天讲不出话难受死///
//uva 336 BFS by zhuhua
//limit time:3000ms
//AC time:130ms
#include <iostream>
#include <cstdio>
#include <map>
#include <vector>
#include <queue>
using namespace std;
const int INF=1000;
int TotNode;
map <int,int> Distance;
map<int, vector <int> >field;//不能用二维vector因为node上的数大小未知
void bfs(int ini)
{
//距离初始化到最大
map <int,int>::iterator it;
for(it=Distance.begin();it!=Distance.end();it++)
{
it->second=INF;
}
//用队列算到各可达点距离
queue <int> calcu;
calcu.push(ini);
Distance[ini]=0;
while(!calcu.empty())
{
int x=calcu.front();
calcu.pop();
for(int i=0;i<field[x].size();i++)
{
int next=field[x][i];
if(Distance[next]==INF)
{
Distance[next]=Distance[x]+1;
calcu.push(next);
}
}
}
}
int main()
{
int Case=1;
int NC,node1,node2;//测试总数这名很好听啊
int initial,TTL;
int i,NotReach;
while(cin>>NC&&NC)
{
field.clear();
Distance.clear();
for(i=0;i<NC;i++)
{
cin>>node1>>node2;
field[node1].push_back(node2);
field[node2].push_back(node1);
Distance[node1]=0;//只是为了初始化一下所有节点其他没什么卵用
Distance[node2]=0;
}
TotNode=Distance.size();
while(cin>>initial>>TTL)
{
//cout<<initial<<TTL<<endl;
if(initial==0&&TTL==0)break;
bfs(initial);
//距离超过TTL就达不到嘛。一共三十个节点肯定不会超
NotReach=0;
map <int,int>::iterator it;
for(it=Distance.begin();it!=Distance.end();it++){
if(it->second >TTL)NotReach++;
}
printf("Case %d: %d nodes not reachable from node %d with TTL = %d.\n",Case++,NotReach,initial,TTL);
}
}
return 0;
}