poj 2432 Around the world bfs+哈希
由于每个点的状态包含走过来的距离,所以要存二维的状态,但是状态总量太多,所以可以用哈希来搞。
那么就是bfs最短路,哈希记录状态了。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=5e3+9;
int n,m;
int a[maxn];
struct
{
struct
{
int next,to;
}e[maxn*10];
int head[maxn],lon;
void clear()
{
memset(head,-1,sizeof(head));
lon=-1;
}
void add(int from,int to)
{
e[++lon].to=to;
e[lon].next=head[from];
head[from]=lon;
}
}edge; struct
{
int head[111111],lon;
struct
{
int t,dist,next,sum;
}data[1111111];
void clear()
{
memset(head,-1,sizeof(head));
lon=-1;
}
bool push(int t,int dist,int sum)
{
int key=(t+abs(dist)%360*n)%111111;
for(int k=head[key];k!=-1;k=data[k].next)
{
if(t==data[k].t&&dist==data[k].dist)
return false;
}
data[++lon].t=t;
data[lon].dist=dist;
data[lon].next=head[key];
data[lon].sum=sum;
head[key]=lon;
return true;
}
}hash; struct
{
int t,dist,sum;
}que[1111111];
int bfs()
{
hash.clear();
int front=1,end=0;
que[++end].t=1;
que[end].sum=que[end].dist=0;
hash.push(1,0,0); while(front<=end)
{
int t=que[front].t;
int dist=que[front].dist;
int sum=que[front++].sum;
for(int k=edge.head[t];k!=-1;k=edge.e[k].next)
{
int u=edge.e[k].to;
int c=(a[u]+360-a[t])%360;
int uc=(a[t]+360-a[u])%360;
int tmp;
if(c<uc) tmp=c;
else tmp=-uc;
if(u==1&&dist+tmp!=0) return sum+1;
if(hash.push(u,dist+tmp,sum+1))
{
que[++end].t=u;
que[end].dist=dist+tmp;
que[end].sum=sum+1;
}
}
}
return -1;
} int main()
{
// freopen("in.txt","r",stdin);
while(scanf("%d %d",&n,&m)!=EOF)
{
edge.clear();
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1,from,to;i<=m;i++)
{
scanf("%d %d",&from,&to);
edge.add(from,to);
edge.add(to,from);
}
cout<<bfs()<<endl;
}
return 0;
}
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=5e3+9;
int n,m;
int a[maxn];
struct
{
struct
{
int next,to;
}e[maxn*10];
int head[maxn],lon;
void clear()
{
memset(head,-1,sizeof(head));
lon=-1;
}
void add(int from,int to)
{
e[++lon].to=to;
e[lon].next=head[from];
head[from]=lon;
}
}edge; struct
{
int head[111111],lon;
struct
{
int t,dist,next,sum;
}data[1111111];
void clear()
{
memset(head,-1,sizeof(head));
lon=-1;
}
bool push(int t,int dist,int sum)
{
int key=(t+abs(dist)%360*n)%111111;
for(int k=head[key];k!=-1;k=data[k].next)
{
if(t==data[k].t&&dist==data[k].dist)
return false;
}
data[++lon].t=t;
data[lon].dist=dist;
data[lon].next=head[key];
data[lon].sum=sum;
head[key]=lon;
return true;
}
}hash; struct
{
int t,dist,sum;
}que[1111111];
int bfs()
{
hash.clear();
int front=1,end=0;
que[++end].t=1;
que[end].sum=que[end].dist=0;
hash.push(1,0,0); while(front<=end)
{
int t=que[front].t;
int dist=que[front].dist;
int sum=que[front++].sum;
for(int k=edge.head[t];k!=-1;k=edge.e[k].next)
{
int u=edge.e[k].to;
int c=(a[u]+360-a[t])%360;
int uc=(a[t]+360-a[u])%360;
int tmp;
if(c<uc) tmp=c;
else tmp=-uc;
if(u==1&&dist+tmp!=0) return sum+1;
if(hash.push(u,dist+tmp,sum+1))
{
que[++end].t=u;
que[end].dist=dist+tmp;
que[end].sum=sum+1;
}
}
}
return -1;
} int main()
{
// freopen("in.txt","r",stdin);
while(scanf("%d %d",&n,&m)!=EOF)
{
edge.clear();
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1,from,to;i<=m;i++)
{
scanf("%d %d",&from,&to);
edge.add(from,to);
edge.add(to,from);
}
cout<<bfs()<<endl;
}
return 0;
}
#include
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=5e3+9;
int n,m;
int a[maxn];
struct
{
struct
{
int next,to;
}e[maxn*10];
int head[maxn],lon;
void clear()
{
memset(head,-1,sizeof(head));
lon=-1;
}
void add(int from,int to)
{
e[++lon].to=to;
e[lon].next=head[from];
head[from]=lon;
}
}edge; struct
{
int head[111111],lon;
struct
{
int t,dist,next,sum;
}data[1111111];
void clear()
{
memset(head,-1,sizeof(head));
lon=-1;
}
bool push(int t,int dist,int sum)
{
int key=(t+abs(dist)%360*n)%111111;
for(int k=head[key];k!=-1;k=data[k].next)
{
if(t==data[k].t&&dist==data[k].dist)
return false;
}
data[++lon].t=t;
data[lon].dist=dist;
data[lon].next=head[key];
data[lon].sum=sum;
head[key]=lon;
return true;
}
}hash; struct
{
int t,dist,sum;
}que[1111111];
int bfs()
{
hash.clear();
int front=1,end=0;
que[++end].t=1;
que[end].sum=que[end].dist=0;
hash.push(1,0,0); while(front<=end)
{
int t=que[front].t;
int dist=que[front].dist;
int sum=que[front++].sum;
for(int k=edge.head[t];k!=-1;k=edge.e[k].next)
{
int u=edge.e[k].to;
int c=(a[u]+360-a[t])%360;
int uc=(a[t]+360-a[u])%360;
int tmp;
if(c<uc) tmp=c;
else tmp=-uc;
if(u==1&&dist+tmp!=0) return sum+1;
if(hash.push(u,dist+tmp,sum+1))
{
que[++end].t=u;
que[end].dist=dist+tmp;
que[end].sum=sum+1;
}
}
}
return -1;
} int main()
{
// freopen("in.txt","r",stdin);
while(scanf("%d %d",&n,&m)!=EOF)
{
edge.clear();
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1,from,to;i<=m;i++)
{
scanf("%d %d",&from,&to);
edge.add(from,to);
edge.add(to,from);
}
cout<<bfs()<<endl;
}
return 0;
}
<iostream>#include <cstdio>#include <cstring>using namespace std;const int maxn=5e3+9;int n,m;int a[maxn];struct{ struct { int next,to; }e[maxn*10]; int head[maxn],lon; void clear() { memset(head,-1,sizeof(head)); lon=-1; } void add(int from,int to) { e[++lon].to=to; e[lon].next=head[from]; head[from]=lon; }}edge;struct{ int head[1111111],lon; struct { int t,dist,next,sum; }data[1111111]; void clear() { memset(head,-1,sizeof(head)); lon=-1; } bool push(int t,int dist,int sum) { int key=t+abs(dist)%360*n; for(int k=head[key];k!=-1;k=data[k].next) { if(t==data[k].t&&dist==data[k].dist) return false; } data[++lon].t=t; data[lon].dist=dist; data[lon].next=head[key]; data[lon].sum=sum; head[key]=lon; return true; }}hash;struct{ int t,dist,sum;}que[1111111];int bfs(){ hash.clear(); int front=1,end=0; que[++end].t=1; que[end].sum=que[end].dist=0; hash.push(1,0,0); while(front<=end) { int t=que[front].t; int dist=que[front].dist; int sum=que[front++].sum; for(int k=edge.head[t];k!=-1;k=edge.e[k].next) { int u=edge.e[k].to; int c=(a[u]+360-a[t])%360; int uc=(a[t]+360-a[u])%360; int tmp; if(c<uc) tmp=c; else tmp=-uc; if(u==1&&dist+tmp!=0) return sum+1; if(hash.push(u,dist+tmp,sum+1)) { que[++end].t=u; que[end].dist=dist+tmp; que[end].sum=sum+1; } } } return -1;}int main(){// freopen("in.txt","r",stdin); while(scanf("%d %d",&n,&m)!=EOF) { edge.clear(); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1,from,to;i<=m;i++) { scanf("%d %d",&from,&to); edge.add(from,to); edge.add(to,from); } cout<<bfs()<<endl; } return 0;}
poj 2432 Around the world bfs+哈希的更多相关文章
- POJ 2432
\(\mathbf{POJ\;2432}\)题解 题意 给出圆上的\(N\)个点,每个点有一个经度(大于\(0\)小于\(360\)):再给出\(M\)条双向边,保证边\(x y\)仅会沿圆上较短的弧 ...
- POJ 2251 Dungeon Master --- 三维BFS(用BFS求最短路)
POJ 2251 题目大意: 给出一三维空间的地牢,要求求出由字符'S'到字符'E'的最短路径,移动方向可以是上,下,左,右,前,后,六个方向,每移动一次就耗费一分钟,要求输出最快的走出时间.不同L层 ...
- POJ 1426 Find The Multiple --- BFS || DFS
POJ 1426 Find The Multiple 题意:给定一个整数n,求n的一个倍数,要求这个倍数只含0和1 参考博客:点我 解法一:普通的BFS(用G++能过但C++会超时) 从小到大搜索直至 ...
- UVA 10651 Pebble Solitaire(bfs + 哈希判重(记忆化搜索?))
Problem A Pebble Solitaire Input: standard input Output: standard output Time Limit: 1 second Pebble ...
- POJ.3894 迷宫问题 (BFS+记录路径)
POJ.3894 迷宫问题 (BFS+记录路径) 题意分析 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, ...
- POJ 3669 Meteor Shower【BFS】
POJ 3669 去看流星雨,不料流星掉下来会砸毁上下左右中五个点.每个流星掉下的位置和时间都不同,求能否活命,如果能活命,最短的逃跑时间是多少? 思路:对流星雨排序,然后将地图的每个点的值设为该点最 ...
- POJ 1573 Robot Motion(BFS)
Robot Motion Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 12856 Accepted: 6240 Des ...
- [POJ 1635] Subway tree systems (树哈希)
题目链接:http://poj.org/problem?id=1635 题目大意:给你两棵树的dfs描述串,从根节点出发,0代表向深搜,1代表回溯. 我刚开始自己设计了哈希函数,不知道为什么有问题.. ...
- POJ 3126 Prime Path (BFS)
[题目链接]click here~~ [题目大意]给你n,m各自是素数,求由n到m变化的步骤数,规定每一步仅仅能改变个十百千一位的数,且变化得到的每个数也为素数 [解题思路]和poj 3278类似.b ...
随机推荐
- C#压缩文件为zip格式
Vercher C#压缩文件为zip格式 需要ICSharpCode.SharpZipLib.dll,网上下载的到. 代码是从网上找来的: 1 public class ZipClass 2 { ...
- Uri、UriMatcher、ContentUris详解
http://blog.csdn.net/feng88724/article/details/6331396 1.Uri 通用资源标志符(Universal Resource Identifier, ...
- Android--WebView控件
WebView 一 简介: WebView一般用于将Android页面已HTML的形式展现,我们一般叫它HTML5开发: WebView可以使得网页轻松的内嵌到app里,还可以直接跟js相互调用,通过 ...
- SQL语句之二建表
use Test --进入需要建表的数据库if exists(select * from sysobjects where name='MyTable')--表是否已经存在drop table MyT ...
- PL/SQL Developer简单使用
表在以下:
- IOS常用开源库
转自:http://www.csdn.net/article/2013-06-18/2815806-GitHub-iOS-open-source-projects-two/1 1. AFNetwork ...
- Alljoyn 概述(2)
AllJoyn 基本概念 • 总线(Bus) – 实现P2P通信的基础 – AllJoyn 的底层协议类似于D-Bus,相当于是跨设备分布式的 D-Bus • 总线附件(Bus Attachment) ...
- SpringMVC4+thymeleaf3的一个简单实例(篇四:form表单数据验证)
关于表单数据验证有很多中方法,这里我仅介绍JSR303注解验证.JSR303仅仅是一个规范,这里我们要用到它的一个实现:hibernate-validator. 注意在spring的配置文件sprin ...
- 获取C++类成员变量的地址偏移
今天有在校学生问怎么获取类中的成员变量的地址偏移量,这个应该是很多初学C++的人很好奇的问题.以前我在学校的时候,也有过这种需求.忘了当时是要写什么“奇怪的程序”了,反正需要获取一个类的成员变量的地址 ...
- Codeforces 543C Remembering Strings(DP)
题意比较麻烦 见题目链接 Solution: 非常值得注意的一点是题目给出的范围只有20,而众所周知字母表里有26个字母.于是显然对一个字母进行变换后是不影响到其它字符串的. 20的范围恰好又是常见状 ...