HDOJ--1869--六度分离(用三种算法写的,希望能比較出来他们之间的差别)
六度分离
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1791 Accepted Submission(s): 696
Lele对这个理论相当有兴趣,于是,他在HDU里对N个人展开了调查。
他已经得到了他们之间的相识关系,如今就请你帮他验证一下“六度分离”是否成立吧。
对于每组測试。第一行包括两个整数N,M(0<N<100,0<M<200),分别代表HDU里的人数(这些人分别编成0~N-1号),以及他们之间的关系。
接下来有M行。每行两个整数A,B(0<=A,B<N)表示HDU里编号为A和编号B的人互相认识。
除了这M组关系,其它随意两人之间均不相识。
思路:额,把每条边的权值看做1。然后比較随意两个点的距离。看是否存在大于7的。由于是6个朋友,所以应该是7条边以内都能够连接不论什么点。(第一次一遍过一道题,简直开心的不要不要的。)
#include<stdio.h>
#include<string.h>
#define INF 0x3f3f3f3f
int vis[110],map[110][110],dis[110];
int n,m;
void init(){
int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++){
if(j==i)
map[i][j]=map[j][i]=0;
else
map[i][j]=map[j][i]=INF;
}
}
void dijkstra(int beg){
int i;
memset(vis,0,sizeof(vis));
for(i=0;i<n;i++)
dis[i]=map[beg][i];
for(i=0;i<n;i++){
int j,k,temp=INF;
for(j=0;j<n;j++)
if(!vis[j]&&temp>dis[j])
temp=dis[k=j];
if(temp==INF)
break;
vis[k]=1;
for(j=0;j<n;j++)
if(!vis[j]&&dis[j]>dis[k]+map[k][j])
dis[j]=dis[k]+map[k][j];
}
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF){
init();
for(int i=0;i<m;i++){
int a,b;
scanf("%d%d",&a,&b);
map[a][b]=map[b][a]=1;
}
int i,j,max=-1;
for(i=0;i<n;i++){
dijkstra(i);
for(j=i;j<n;j++){
if(max<dis[j])
max=dis[j];
}
}
if(max>7)
printf("No\n");
else
printf("Yes\n");
}
return 0;
}
用SPFA做了一次纯粹练一下自己对模板的熟悉度。
#include<stdio.h>
#include<string.h>
#include<queue>
#define N 110
#define M 410
#define INF 0x3f3f3f3f
using namespace std;
int dis[N],vis[N],head[N],n,m,edgenum;
struct node{
int from,to,cost,next;
}edge[M];
void init(){
edgenum=0;
memset(head,-1,sizeof(head));
}
void add(int u,int v){
node E={u,v,1,head[u]};
edge[edgenum]=E;
head[u]=edgenum++;
}
void spfa(int beg){
queue<int>q;
memset(dis,INF,sizeof(dis));
memset(vis,0,sizeof(vis));
dis[beg]=0;
vis[beg]=1;
q.push(beg);
while(!q.empty()){
int i,u=q.front();
q.pop();
vis[u]=0;
for(i=head[u];i!=-1;i=edge[i].next){
int v=edge[i].to;
if(dis[v]>dis[u]+edge[i].cost){
dis[v]=dis[u]+edge[i].cost;
if(!vis[v]){
vis[v]=1;
q.push(v);
}
}
}
}
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF){
init();
while(m--){
int a,b;
scanf("%d%d",&a,&b);
add(a,b);
add(b,a);
}
int i,j,max=-1;
for(i=0;i<n;i++){
spfa(i);
for(j=0;j<n;j++)
if(max<dis[j])
max=dis[j];
}
if(max>7)
printf("No\n");
else
printf("Yes\n");
}
return 0;
}
floyd算法:
#include<stdio.h>
#include<string.h>
#define INF 0x3f3f3f3f
#define N 220
int dis[N][N],n,m;
void init(int num){
memset(dis,INF,sizeof(dis));
for(int i=0;i<num;i++)
for(int j=0;j<num;j++)
if(i==j)
dis[i][j]=0;
}
void floyd(){
for(int k=0;k<n;k++)
for(int i=0;i<n;i++)
for(int j=0;j<n;j++){
if(dis[i][j]>dis[i][k]+dis[k][j])
dis[i][j]=dis[i][k]+dis[k][j];
}
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF){
init(n);
while(m--){
int a,b;
scanf("%d%d",&a,&b);
dis[a][b]=dis[b][a]=1;
}
floyd();
int flag=0;
for(int i=0;i<n;i++)
for(int j=i;j<n;j++)
if(dis[i][j]>7)
flag=1;
if(flag)
printf("No\n");
else
printf("Yes\n");
}
return 0;
}
HDOJ--1869--六度分离(用三种算法写的,希望能比較出来他们之间的差别)的更多相关文章
- jQuery中.bind() .live() .delegate() .on()的区别 和 三种方式写光棒事件 动画
地狱的镰刀 bind(type,[data],fn) 为每个匹配元素的特定事件绑定事件处理函数. $("a").bind("click",function(){ ...
- JavaScript--------------------jQuery中.bind() .live() .delegate() .on()的区别 和 三种方式写光棒事件 动画
bind(type,[data],fn) 为每个匹配元素的特定事件绑定事件处理函数. $("a").bind("click",function(){alert( ...
- 最短路问题的三种算法&模板
最短路算法&模板 最短路问题是图论的基础问题.本篇随笔就图论中最短路问题进行剖析,讲解常用的三种最短路算法:Floyd算法.Dijkstra算法及SPFA算法,并给出三种算法的模板.流畅阅读本 ...
- c语言求回文数的三种算法的描述
c语言求回文数的三种算法的描述 题目描述 注意:(这些回文数都没有前导0) 1位的回文数有0,1,2,3,4,5,6,7,8,9 共10个: 2位的回文数有11,22,33,44,55,66,77,8 ...
- Java利用DES/3DES/AES这三种算法分别实现对称加密
转载地址:http://blog.csdn.net/smartbetter/article/details/54017759 有两句话是这么说的: 1)算法和数据结构就是编程的一个重要部分,你若失掉了 ...
- 图文实例解析,InnoDB 存储引擎中行锁的三种算法
前文提到,对于 InnoDB 来说,随时都可以加锁(关于加锁的 SQL 语句这里就不说了,忘记的小伙伴可以翻一下上篇文章),但是并非随时都可以解锁.具体来说,InnoDB 采用的是两阶段锁定协议(tw ...
- 内存分配---FF、BF、WF三种算法
动态分区分配是根据进程的实际需要,动态的为之分配内存空间.而在实现可变分区分配时,将涉及到分区分配中 所用的数据结构.分区分配算法和分区的分配与内存回收的过程. 分区分配中的数据结构:(1)描述空闲块 ...
- Django中三种方式写form表单
除了在html中自己手写form表单外,django还可以通过 继承django.forms.Form 或django.forms.ModelForm两个类来自动生成form表单,下面依次利用三种方式 ...
- hdoj 1869 六度分离
Problem Description 1967年,美国著名的社会学家斯坦利·米尔格兰姆提出了一个名为“小世界现象(small world phenomenon)”的著名假说,大意是说,任何2个素不相 ...
随机推荐
- 九度oj 题目1347:孤岛连通工程
题目描述: 现在有孤岛n个,孤岛从1开始标序一直到n,有道路m条(道路是双向的,如果有多条道路连通岛屿i,j则选择最短的那条),请你求出能够让所有孤岛都连通的最小道路总长度. 输入: 数据有多组输入. ...
- 【bzoj3689】异或之 可持久化Trie树+堆
题目描述 给定n个非负整数A[1], A[2], ……, A[n].对于每对(i, j)满足1 <= i < j <= n,得到一个新的数A[i] xor A[j],这样共有n*(n ...
- Tsinsen 1485 Catch The Penguins 抓企鹅 ——Bitset
[题目分析] 刚开始想的是KD-Tree去暴力求解. 写了半天还没有暴力得的分数多(说好的nlogn呢) 直接按照四个维度排序. 然后扫一遍,用bitset去维护,然后对于四个维度小于一个询问的结果取 ...
- AtCoder Regular Contest 074F - Lotus Leaves
$n \leq 300,m \leq 300$,$n*m$的格子里有起点有终点有空地有障碍,人会从起点选一个同行或同列空地跳过去,然后一直这样跳到终点.求至少删掉多少格子使得人跳不到终点. 首先S和T ...
- @Validated注解
参考: https://blog.csdn.net/changerzhuo_319/article/details/55804651
- 同时在windows和linux环境开发时换行符的处理
Git 的 core.autocrlf 參數默认为true,即每次 checkin 時,Git 會將純文字類型的檔案中的所有 CRLF 字元轉換為 LF,也就是版本庫中的換行符號一律存成 LF:在 c ...
- [NOIP2012T3]开车旅行
题目描述 NOIP 2012 提高组 题3小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 ...
- 果皇的矩阵[matrix]
#1101. 果皇的矩阵[matrix] 题目描述 输入格式 一行两个数,表示 N,M. 输出格式 一行一个数,表示答案对 10^9+7 取模后的结果 样例 样例输入 3 3 样例输出 38 数据范围 ...
- 注解@RequestMapping value 用法
本文引自:https://blog.csdn.net/qq_33811662/article/details/80864784 RequestMapping是一个用来处理请求地址映射的注解,可用于类. ...
- TreeView 与 ListView
ListView: viewStyle icon 大图标 list 列表,单列 report 报表 smallIcon 小图标 largeImage 与icon对应 smallImage 与saml ...