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 ...
随机推荐
- 吴柄锡 github----MHA helper
https://github.com/wubx http://www.cnblogs.com/kissdb/p/4009620.html
- Android Activity横竖屏转换的生命周期
新创建一个Activity,用来此次测试. 先贴代码 package com.hugo.apj.activitylifetest; import android.support.v7.app.AppC ...
- DataTable用法
在项目中经常用到DataTable,如果DataTable使用得当,不仅能使程序简洁实用,而且能够提高性能,达到事半功倍的效果,现对DataTable的使用技巧进行一下总结. 一.DataTable简 ...
- Unity3D GUI学习
Unity3D内置有GUI, 首先,使用GUI实现一个按钮,并且点击实现触发, void OnGUI() { //GUI.Button (new Rect (10,10,50,50), "n ...
- Android Listview with different layout for each row
http://stackoverflow.com/questions/4777272/android-listview-with-different-layout-for-each-row 其关键在重 ...
- listActivity和ExpandableListActivity的简单用法
http://www.cnblogs.com/limingblogs/archive/2011/10/09/2204866.html 今天自己简单的总结了listActivity和Expandable ...
- oracle中所有关于时间日期的问题总结
select current_date as 当前会话时间,sysdate as 系统时间, systimestamp as 系统详细时间 from dual;
- iOS里面消除使用代理调用方法时间警告问题
iOS里面有三种调用函数的方式: 直接调用方法 [对象名 方法]; performselector: [对象名 perform方法]; NSInvocation 调用 在使用代理调用 ...
- CentOS 6.5 IP 设置
DEVICE=eth0TYPE=EthernetUUID=7d6d54e0-054d-472b-8cc1-080f16ef36c1ONBOOT=yesNM_CONTROLLED=yesBOOTPROT ...
- [C#]获取最近在Windows上所使用的文件
class RecentlyFileHelper { public static string GetShortcutTargetFile(string shortcutFilename) { var ...