`

joj 1016: Degrees of separation

    博客分类:
  • ACM
阅读更多
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);
	}
}

分享到:
评论
2 楼 yjyongz 2010-07-06  
#include <iostream>
#include <string>
#include <map>
#include <queue>
using namespace std;

map< string,vector<string> > mp;
map<string,bool> visited;

void BFS(string name1,string name2)
{
	queue<string> qu;
	qu.push(name1);
	int dis[10];
	int distance = 0,k=0;
	bool find = false;
	while(!qu.empty())
	{	
		int size = qu.size();
		for(int j=0;j<size;j++)
		{
			string tp1 = qu.front();
			visited[tp1] = true;
			qu.pop();
			vector<string> vec = mp[tp1];
			for(int i=0;i<vec.size();i++)
			{
				if(name2==vec[i])
				{	
					
					find = true;
					dis[k] = distance;
					k++;
				}
				if(visited.count(vec[i])==0)
				{
					visited[vec[i]] = 1;//visited
					qu.push(vec[i]);
				}
			}
		}
		distance++;
	}
	if(!find)
		cout<<name1<<" has no connection to "<<name2<<"."<<endl;
	else
	{
		int small=10000;
		for(int i=0;i<k;i++)
			if(small>dis[i])
				small = dis[i];
		cout<<name1<<" is separated from "<<name2<<" by "<<small<<" degrees."<<endl;
	}
	return;
}
int main()
{
	int persons;
	cin>>persons;
	for(int i=0;i<persons;i++)
	{
		string name; 
		cin>>name;
		int nKnown;
		cin>>nKnown;
		vector<string> v;
		mp[name] = v;
		for(int j=0;j<nKnown;j++)
		{
			string knowOther;
			cin>>knowOther;
			mp[name].push_back(knowOther);
		}
	}
	int nCase;
	cin>>nCase;
	for(int i=0;i<nCase;i++)
	{
		string name1,name2;
		cin>>name1>>name2;
		BFS(name1,name2);
		visited.clear();
	}
	return 0;
}
1 楼 yjyongz 2010-07-06  
#include <iostream>
#include <string>
#include <map>
#include <queue>
using namespace std;

map< string,vector<string> > mp;
map<string,bool> visited;

void BFS(string name1,string name2)
{
queue<string> qu;
qu.push(name1);
int dis[10];
int distance = 0,k=0;
bool find = false;
while(!qu.empty())
{
int size = qu.size();
for(int j=0;j<size;j++)
{
string tp1 = qu.front();
visited[tp1] = true;
qu.pop();
vector<string> vec = mp[tp1];
for(int i=0;i<vec.size();i++)
{
if(name2==vec[i])
{

find = true;
dis[k] = distance;
k++;
}
if(visited.count(vec[i])==0)
{
visited[vec[i]] = 1;//visited
qu.push(vec[i]);
}
}
}
distance++;
}
if(!find)
cout<<name1<<" has no connection to "<<name2<<"."<<endl;
else
{
int small=10000;
for(int i=0;i<k;i++)
if(small>dis[i])
small = dis[i];
cout<<name1<<" is separated from "<<name2<<" by "<<small<<" degrees."<<endl;
}
return;
}
int main()
{
int persons;
cin>>persons;
for(int i=0;i<persons;i++)
{
string name;
cin>>name;
int nKnown;
cin>>nKnown;
vector<string> v;
mp[name] = v;
for(int j=0;j<nKnown;j++)
{
string knowOther;
cin>>knowOther;
mp[name].push_back(knowOther);
}
}
int nCase;
cin>>nCase;
for(int i=0;i<nCase;i++)
{
string name1,name2;
cin>>name1>>name2;
BFS(name1,name2);
visited.clear();
}
return 0;
}

相关推荐

    Joj - Java Version of Java-开源

    Java 开源项目 Joj 是一个致力于为 Java 源代码提供对象化表示的库,它类似于 JDOM 在处理 XML 文档中的角色。Joj 的设计目标是为开发者提供一种更直观、更方便的方式来操作和解析 Java 代码,使得在处理大量 Java ...

    joj上做的一些ACM试题

    【标题】:“JOJ上做的一些ACM试题” 在计算机科学领域,ACM(Association for Computing Machinery)国际大学生程序设计竞赛是一项备受瞩目的比赛,旨在提升大学生的算法设计、问题解决以及团队协作能力。JOJ...

    joj 部分题目答案 自己做的 仅供参考

    joj 部分题目答案 自己做的 仅供参考 joj 部分题目答案 自己做的 仅供参考 joj 部分题目答案 自己做的 仅供参考 joj 部分题目答案 自己做的 仅供参考 joj 部分题目答案 自己做的 仅供参考

    joj acm 部分习题解答

    【标题】"joj acm 部分习题解答"揭示了这是一份与JOJ(Judge Online Job)和ACM(国际大学生程序设计竞赛)相关的资源,主要是作者对于某些题目的解题思路和代码实现。JOJ是用于在线评测编程竞赛题目的一种平台,而...

    acm.rar_acm jlu 10_acm jlu 1029_joj 1237_joj10

    "joj_1237"和"joj10"可能分别对应JOJ平台上的两个具体题目编号,1237号问题和编号为10的一组题目。这些标签有助于分类和检索这些源代码,便于查找特定题目或比赛的解决方案。 在压缩包内的文件名列表中,只有一个...

    JOJ-jilin-university--acm.rar_joj

    【标题】"JOJ-jilin-university--acm.rar_joj" 提供的是吉林大学JOJ在线判题系统的编程竞赛代码集,主要用于帮助初学者入门。 【描述】中的信息表明,这个压缩包内的代码样例是专门为在JOJ平台上进行编程训练的学生...

    joj.rar_joj

    操作系统中的页面置换算法是内存管理的重要组成部分,尤其是在虚拟内存系统中。先进先出(First In First Out,简称FIFO)页面置换算法是一种简单的页面置换策略,它的基本思想是:当需要淘汰一个页面时,选择最早...

    JoJ-crx插件

    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 此文档标题明确指出了文档的主要内容——一个由吉林大学组织编写的ACM竞赛题集,并且该题集是以PDF格式提供的。这里提到的“JOJ”即吉林大学在线裁判系统(Jilin University On...

    吉林大学 joj 1000-2645题代码

    吉林大学 joj 1000-2645题代码,嘿嘿,大家就不用在花JPOINT买代码了,祝ACMer实现自己的心愿

    joj 1424 硬币兑换问题

    JOJ 1424题目,即硬币兑换问题,要求参与者通过编程实现一种算法,它能够找到使用最少数量硬币凑成特定金额的方法。动态规划作为一种有效的算法策略,被广泛应用于此类问题的解决之中。 动态规划,简称为DP,是解决...

    acm joj 1600

    根据给定的信息,本文将详细解释“acm joj 1600”中的两种大数取模运算方法。此问题主要关注如何高效地计算形如 \(a^b \mod m\) 的表达式,这对于处理大数据或进行密码学运算非常重要。 ### 大数取模运算 #### ...

    一个有关调度的问题joj1015

    这个题其实现在想起来也不知道是怎么就给ac的。

    安全文明施工管理目标【精选文档】.doc

    4. **现场管理目标**:根据JOJ59—59安全检查标准和重庆市建筑工地文明施工标准,对施工现场进行规范化管理,争取成为重庆市的安全文明施工示范工地。 5. **安全管理目标**: - **安全教育目标**:建立安全生产...

    JoJo-s-Bizarre-Survival:一个模组,将JoJo的奇异冒险中的看台添加到Minecraft

    该mod基于荒木飞吕彦的JoJo的奇妙冒险漫画和动漫系列。 这个mod也受到KnightDemon的1.12 mod 极大启发。 这个mod的目的是要从专营权中尽可能多地增加Minecraft,该mod目前仅包含Stand能力,其他能力(Hamon,...

    ControlEstoque_GH:..

    Este Projeto签证是由estoque进行的,它是由mer mercadorias uma determinada empresa sejam averiguadas和atualizadas ... 2021年1月20日,由JoséCláudiodeAraújoJúnior和Annielly Ferreira de Sousa所设计。

    furystudios

    furystudios 普尔维·扎达塔克(Prvi zadatak) ...DroppingOff - radnikhodajućidolazi做pripadajuće科萨雷(izvedeno kroz provjeru tagova kutije)我卡达joj JE dovoljno blizu,fizičkiJE lan

    大智慧最新安装

    大智慧最新安装包,老的已经过期不能查询个人自选股,所以推荐最新的大智慧给大家安装

Global site tag (gtag.js) - Google Analytics