ural 1837. Isenbaev's Number bfs
题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1837
描述:
Isenbaev是国外的一个大牛。
现在有许多人要参加ACM ICPC。
一共有n个组,每组3个人。同组的3个人都是队友。
大家都想知道自己与大牛的最小距离是多少。
大牛与自己的最小距离当然是0。大牛的队友和大牛的最小距离是1。大牛的队友的队友和大牛的最小距离是2……以此类推。
如果实在和大牛没有关系的只好输出undefined了。
第一行读入n。表示有n个组。1 ≤ n ≤ 100
接下来n行,每行有3个名字,名字之间用空格隔开。每个名字的开头都是大写的。
每行输出一个名字,名字后面空格后输出数字a或者字符串undefined,a代表最小距离。
名字按字典序输出。
思路:
这一题我做的相当纠结,整了好几个小时。其实思路很简单,就是从Isenbaev这个人开始bfs,由于bfs可以记录每个点到起始搜索点的最短距离,正好就是答案。但是要注意没有Ixenbaev的情况,我已开始就栽在这了。
但是有几个问题:1:建图问题。每个点不是 int了,都是string类型,不好建图。后来想了想就用 了stl的map,把每个人名和int型映射,int就代表这个节点。先把所有人名插入到map里面,(这时已经按照字典序排列了,map容器的特性)。这样就建好图了。每个人名都有个int编号了,就用邻接矩阵建图再bfs就好了。bfs记录每个节点的dis[] 是多少,可以看看算法导论上这一节讲的挺好的。
2特殊case。有些情况是这组人没有一个人是 Isenbaev,这时候所有人都是undefined.一开始就没考虑到结果runtime error #3.
//g++ 4.7.2 0.031s
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <map>
#include <string> //Don't forget this,or failed compile by vc++
using namespace std;
const int M = 300;
bool adj[M][M], vis[M]; //adj[][]邻接矩阵
int n, dis[M];
void bfs(int start)
{
int u;
queue<int> q;
u = start;
dis[u] = 0;
q.push(u);
vis[u] = 1;
while (!q.empty())
{
u = q.front(); q.pop();
for (int v = 1; v <= n; ++v)
{
if (!vis[v] && adj[u][v])
{
vis[v] = 1;
dis[v] = dis[u] + 1; //记录距离
q.push(v);
}
}
}
}
int main()
{
int casenum;
scanf("%d", &casenum);
string name[M][4];
std::map<string, int> t;
for (int i = 1; i <= casenum; ++i)
for (int j = 1; j <= 3; ++j)
{
cin >> name[i][j]; //先把输入存在name[][]里面
t.insert(make_pair(name[i][j], 0));
}
int num = 1;
std::map<string, int>::iterator it;
for (it = t.begin(); it != t.end(); ++it) //给按照字典序排好的人名映射编号作为图的结点
(*it).second = num++;
for (int i = 1; i <= casenum; ++i)
{
int it1 = (*t.find(name[i][1])).second, it2 = (*t.find(name[i][2])).second, //找到这三个点,建立邻接矩阵
it3 = (*t.find(name[i][3])).second;
adj[it1][it2] = adj[it2][it3] = adj[it1][it3] = 1;
adj[it2][it1] = adj[it3][it2] = adj[it3][it1] = 1; //无向图,一开始忘了这一句害我调试半天
}
n = t.size(); //有多少个不同的人
it = t.find("Isenbaev");
if (it == t.end()) //处理没有Isenbaev的特殊情况
{
for (it = t.begin(); it != t.end(); ++it)
cout << (*it).first << " " << "undefined" << endl;
return 0;
}
bfs((*it).second);
for (it = t.begin(); it != t.end(); ++it)
{
if (dis[(*it).second] == 0 && (*it).first != "Isenbaev") //处理不连通的点,此时它的dis是0,但不是Isenbaev
cout << (*it).first << " " << "undefined" << endl;
else
cout << (*it).first << " " << dis[(*it).second] << endl;
}
return 0;
}
ural 1837. Isenbaev's Number bfs的更多相关文章
- ural 1837 Isenbaev's Number
http://acm.timus.ru/problem.aspx?space=1&num=1837 #include <cstdio> #include <cstring&g ...
- URAL 1837. Isenbaev's Number (map + Dijkstra || BFS)
1837. Isenbaev's Number Time limit: 0.5 second Memory limit: 64 MB Vladislav Isenbaev is a two-time ...
- 1837. Isenbaev's Number(floyd)
1837 被数据结构部分打击的不行了 换地 刷点简单的 图论第一题 floyd水过 #include <iostream> #include<cstdio> #include& ...
- URAL 1008 - Image Encoding(bfs坑爹题)
坑爹题,两种输入输出互相交换,裸bfs #include <stdio.h> #include <string.h> typedef struct { int x; int y ...
- 17. Letter Combinations of a Phone Number(bfs)
Given a string containing digits from 2-9 inclusive, return all possible letter combinations that th ...
- 第三次组队赛 (DFS&BFS)
网站:CSUST 8月1日 先总结下,不得不说死的很惨,又是第三就不说了,一共7道题,AC了5道,但是有一个组三个人是做的个人赛,有两人AK了.......Orz,然后深搜还是大问题,宽搜倒是不急了. ...
- 2018-2019 ICPC, NEERC, Southern Subregional Contest
目录 2018-2019 ICPC, NEERC, Southern Subregional Contest (Codeforces 1070) A.Find a Number(BFS) C.Clou ...
- [LeetCode] Letter Combinations of a Phone Number(bfs)
Given a digit string, return all possible letter combinations that the number could represent. A map ...
- Nearest number - 2_暴力&&bfs
Description Input is the matrix A of N by N non-negative integers. A distance between two elements A ...
随机推荐
- WCF技术剖析之十一:异步操作在WCF中的应用(下篇)
原文:WCF技术剖析之十一:异步操作在WCF中的应用(下篇) 说完了客户端的异步服务调用(参阅WCF技术剖析之十一:异步操作在WCF中的应用(上篇)),我们在来谈谈服务端如何通过异步的方式为服务提供实 ...
- log4net学习目录
log4net是用来记录日志的,日志是用来帮助我们排除错误和异常的.这是我们编写软件必须要用到的东西,前面总结了一些有关日志和log4net的文章,在这整理个目录东大家参考. C#日志工具汇总 log ...
- 它们偷偷干了啥?教你监督APP的运行
由于Android系统的开放性,很多APP都会在后台运行各种我们不知道的权限,不仅泄露我们隐私,也给系统本身带来极大安全隐患.而且现在很普遍的是,在安装APP时它总会索取特别多的权限,又是拍照又是地理 ...
- boost.xml_parser中文字符问题
当使用xml_parser进行读xml时,如果遇到中文字符会出现解析错误. 网上有解决方案说使用wptree来实现,但当使用wptree来写xml时也会出错.而使用ptree来写中文时不会出错. 综合 ...
- oc 可变參数传递
- (id)initWithFrame:(CGRect)frame delegate:(id<SGFocusImageFrameDelegate>)delegate focusImageI ...
- Swift - 邮件发送功能的实现
使用MessageUI.framework框架除了可以发送短信,还能发送Email,步骤如下: (1)首先判断设备是否有发送邮件功能 (2)如果设备允许发送邮件,创建一个MFMailComposeVi ...
- 如何解决android logcat不打印信息在android开发中
用eclipse进行android开发中经常遇到logcat无任何信息输出,这给我们调试程序带来很大的不便.解决办法:window-->show view-->选择android下的dev ...
- 解决Xcode 7编译错误:does not contain bitcode
连接地址:http://jingyan.baidu.com/article/8065f87f96cf462331249801.html 好不容易更新到Xcode 7.0.1,重新编译代码,报错: do ...
- 技术回归01-Windows内存分配工具
很久没有写技术方面的东西了,这半年主要是在学习别人的东西,对自己提高比较大,算是一次技术回笼吧,这次学习之旅目的是结束技术方面的专注,开始向应用方面找突破口,也就是完成技术积累或者为技术的积累做坚实的 ...
- 【ASP.NET Web API教程】3.2 通过.NET客户端调用Web API(C#)
原文:[ASP.NET Web API教程]3.2 通过.NET客户端调用Web API(C#) 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的 ...