http://acm.jlu.edu.cn/joj/showproblem.php?pid=1016
按照六度空间理论,你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过六个人你就能够认识任何一个陌生人。这就是六度空间理论,也叫小世界理论。
这道题就是告诉你每一个人他认识的人,然后给出两个人之间的间隔,这个间隔就是至少通过几个人认识另一个人。
这个题显然是一个图论的题目,就是求两顶点之间的最短距离,但是比较不易处理的是:这个题开始没有列出所有的顶点,而是直接给出边的信息,这对构造邻接矩阵需要一些处理.
构造完邻接矩阵直接使用floyd算法就可以了。
#include<iostream>
#include<string>
#include<vector>
#include<map>
using namespace std;
const int MAX_DEG = 100000;
struct LineInfo{
string person;
int connect_num;
vector<string> connect_persons;
};
void floyd( vector< vector<int> > & distances ){
int i, j, k;
int n = distances.size();
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
for(k = 0; k < n; k++){
int t_dis = distances[i][k] + distances[k][j];
if(distances[i][j] > t_dis)
distances[i][j] = t_dis;
}
}
int main(){
int n,n_query;
cin >> n;
int i,j;
map<string,int> person_to_index;
vector< vector<int> > matrix;
vector<LineInfo> lines;
for(i = 0; i < n; i++){
LineInfo line;
cin >> line.person >> line.connect_num;
for(j = 0; j < line.connect_num; j++){
string connect_person;
cin >> connect_person;
line.connect_persons.push_back(connect_person);
}
lines.push_back(line);
person_to_index[line.person] = i;
vector<int> v;
for(j = 0; j < n; j++){
v.push_back(MAX_DEG);
}
matrix.push_back(v);
}
for(i = 0; i < n; i++){
LineInfo line = lines[i];
string one = line.person;
int num = line.connect_num;
for(int i = 0; i < num; i++){
int idex,jdex;
idex = person_to_index[one];
jdex = person_to_index[line.connect_persons[i]];
matrix[idex][jdex] = 1;
}
}
floyd(matrix);
cin >> n_query;
for(i = 0; i < n_query; i++){
string p1,p2;
cin >> p1 >> p2;
int p1_index = person_to_index[p1];
int p2_index = person_to_index[p2];
if(matrix[p1_index][p2_index] == MAX_DEG){
cout << p1 << " has no connection to " << p2 << "." << endl;
}else{
cout << p1 << " is separated from " << p2 << " by "
<< matrix[p1_index][p2_index] - 1 << " degrees." << endl;
}
}
return 0;
}
我比较懒,由于这个题构造邻矩阵比较容易,由于数据量不是很大,所以开始使用BFS,时间应该没问题,但是老是WA,不知道什么原因:
#include<iostream>
#include<string>
#include<map>
#include<queue>
using namespace std;
map< string,vector<string> > mp;
map< string, bool > visited;
void BFS(string tp1,string tp2){
queue<string> qu;
qu.push(tp1);
int distance = 0;
while(!qu.empty()){
string p = qu.front();
qu.pop();
vector<string> v = mp[p];
int i = 0;
for(; i < v.size(); i++){
if( tp2 == v[i] ){
cout << tp1 << " is separated from " << tp2
<< " by " << distance << " degrees." << endl;
return;
}
if( visited.count(v[i]) == 0 ) {
qu.push(v[i]);
visited[v[i]] = true;
}
}
distance++;
}
cout << tp1 << " has no connection to " << tp2 << "." << endl;
}
int main(){
int n,ncase;
string onePerson, knownTheOther;
int nknown;
cin >> n;
for(int i = 0; i < n; i++){
cin >> onePerson;
vector<string> v;
mp[onePerson] = v;
cin >> nknown;
for(int i = 0; i < nknown; i++){
cin >> knownTheOther;
mp[onePerson].push_back(knownTheOther);
}
}
cin >> ncase;
string tp1,tp2;
for(int i = 0; i < ncase; i++){
cin >> tp1 >> tp2;
visited.clear();
BFS(tp1,tp2);
}
}
分享到:
相关推荐
Java 开源项目 Joj 是一个致力于为 Java 源代码提供对象化表示的库,它类似于 JDOM 在处理 XML 文档中的角色。Joj 的设计目标是为开发者提供一种更直观、更方便的方式来操作和解析 Java 代码,使得在处理大量 Java ...
【标题】:“JOJ上做的一些ACM试题” 在计算机科学领域,ACM(Association for Computing Machinery)国际大学生程序设计竞赛是一项备受瞩目的比赛,旨在提升大学生的算法设计、问题解决以及团队协作能力。JOJ...
joj 部分题目答案 自己做的 仅供参考 joj 部分题目答案 自己做的 仅供参考 joj 部分题目答案 自己做的 仅供参考 joj 部分题目答案 自己做的 仅供参考 joj 部分题目答案 自己做的 仅供参考
【标题】"joj acm 部分习题解答"揭示了这是一份与JOJ(Judge Online Job)和ACM(国际大学生程序设计竞赛)相关的资源,主要是作者对于某些题目的解题思路和代码实现。JOJ是用于在线评测编程竞赛题目的一种平台,而...
"joj_1237"和"joj10"可能分别对应JOJ平台上的两个具体题目编号,1237号问题和编号为10的一组题目。这些标签有助于分类和检索这些源代码,便于查找特定题目或比赛的解决方案。 在压缩包内的文件名列表中,只有一个...
【标题】"JOJ-jilin-university--acm.rar_joj" 提供的是吉林大学JOJ在线判题系统的编程竞赛代码集,主要用于帮助初学者入门。 【描述】中的信息表明,这个压缩包内的代码样例是专门为在JOJ平台上进行编程训练的学生...
操作系统中的页面置换算法是内存管理的重要组成部分,尤其是在虚拟内存系统中。先进先出(First In First Out,简称FIFO)页面置换算法是一种简单的页面置换策略,它的基本思想是:当需要淘汰一个页面时,选择最早...
Etre au courant quand JoJ est en live,策划人semaine et liens vers lesréséauxauxsocioaux Soyez au courant纠结JoJ开始à流光! 现场直播将继续进行。 约翰·奎因·伊斯特·布鲁和克林·德集团的非官方网站 D...
#### 标题:吉林大学ACM题集.pdf—JOJ 此文档标题明确指出了文档的主要内容——一个由吉林大学组织编写的ACM竞赛题集,并且该题集是以PDF格式提供的。这里提到的“JOJ”即吉林大学在线裁判系统(Jilin University On...
吉林大学 joj 1000-2645题代码,嘿嘿,大家就不用在花JPOINT买代码了,祝ACMer实现自己的心愿
标题“joj 1424 硬币兑换问题”描述的是一个经典的计算机编程问题,它涉及到使用动态规划(Dynamic Programming, DP)方法来解决硬币找零问题。在这个问题中,我们要找到使用最少数量的硬币来凑成特定金额的方式。...
根据给定的信息,本文将详细解释“acm joj 1600”中的两种大数取模运算方法。此问题主要关注如何高效地计算形如 \(a^b \mod m\) 的表达式,这对于处理大数据或进行密码学运算非常重要。 ### 大数取模运算 #### ...
这个题其实现在想起来也不知道是怎么就给ac的。
4. **现场管理目标**:根据JOJ59—59安全检查标准和重庆市建筑工地文明施工标准,对施工现场进行规范化管理,争取成为重庆市的安全文明施工示范工地。 5. **安全管理目标**: - **安全教育目标**:建立安全生产...
该mod基于荒木飞吕彦的JoJo的奇妙冒险漫画和动漫系列。 这个mod也受到KnightDemon的1.12 mod 极大启发。 这个mod的目的是要从专营权中尽可能多地增加Minecraft,该mod目前仅包含Stand能力,其他能力(Hamon,...
Este Projeto签证是由estoque进行的,它是由mer mercadorias uma determinada empresa sejam averiguadas和atualizadas ... 2021年1月20日,由JoséCláudiodeAraújoJúnior和Annielly Ferreira de Sousa所设计。
furystudios 普尔维·扎达塔克(Prvi zadatak) ...DroppingOff - radnikhodajućidolazi做pripadajuće科萨雷(izvedeno kroz provjeru tagova kutije)我卡达joj JE dovoljno blizu,fizičkiJE lan
大智慧最新安装包,老的已经过期不能查询个人自选股,所以推荐最新的大智慧给大家安装