电路维修 这道题虽然乍一看就会想斜对角的两点之间边权受初始电路的影响要么为0要么为1,但是有一个思考点就是可以通过奇偶性,证明相邻的两个点是不可能在同一个电路中。练习一下双端队列。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
const int dx[]={-,-,,};
const int dy[]={-,,-,}; char ss[][];
int xx[],yy[],cc[][];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)scanf("%s",ss[i]+); memset(cc,-,sizeof(cc));
xx[n*m+]=,yy[n*m+]=;cc[][]=;
int head=n*m+,tail=n*m+;bool bk=false;
while(head<=tail)
{
int x=xx[head],y=yy[head];head++;
if(x==n+&&y==m+){printf("%d\n",cc[x][y]);bk=true;break;}
for(int k=;k<=;k++)
{
int tx=x+dx[k],ty=y+dy[k];
if(<tx&&tx<=n+&&<ty&&ty<=m+&&(cc[tx][ty]==-||cc[tx][ty]>cc[x][y]))
{
int g=(!((x>tx)^(y>ty)))?((!(ss[min(x,tx)][min(y,ty)]=='/'))?:):((ss[min(x,tx)][min(y,ty)]=='/')?:);
if(g==)
{
head--;
xx[head]=tx,yy[head]=ty,cc[tx][ty]=cc[x][y];
}
else
{
tail++;
xx[tail]=tx,yy[tail]=ty,cc[tx][ty]=cc[x][y]+;
}
}
}
}
if(bk==false)printf("NO SOLUTION\n");
}
return ;
}

电路维修

poj3635 有点尴尬啊我写的堆优化bfs卡不过去。。。去A*那再做吧

upd:这算哪门子A*啊,真是被discuss的水逼坑死。。。我写了个用路径中最小价格的加油站*油数做预估函数的A*跑的比堆+bfs还慢,结果就是正解就是判断是否之前已经走过更短的(对没错就像最短路那样),剪枝一下就过了???(思维僵化啊菜鸡yzh)

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std; int n,m,c[];
struct edge
{
int x,y,d,next;
}a[];int len,last[];
void ins(int x,int y,int d)
{
len++;
a[len].x=x;a[len].y=y;a[len].d=d;
a[len].next=last[x];last[x]=len;
} int C,st,ed;
struct Astar
{
int x,l,s;
friend bool operator>(Astar n1,Astar n2){return n1.s>n2.s;}
};priority_queue<Astar,vector<Astar>,greater<Astar> >q;
int g[][];
void bfs()
{
memset(g,,sizeof(g));g[st][]=;
while(!q.empty())q.pop();
Astar t;
t.x=st, t.l=, t.s=, q.push(t);
while(!q.empty())
{
Astar tno=q.top();q.pop();
if(tno.x==ed)
{
printf("%d\n",tno.s);
return ;
}
if(tno.l+<=C&&g[tno.x][tno.l+]>g[tno.x][tno.l]+c[tno.x])
{
g[tno.x][tno.l+]=g[tno.x][tno.l]+c[tno.x];
t.x=tno.x, t.l=tno.l+, t.s=tno.s+c[t.x], q.push(t);
}
for(int k=last[tno.x];k;k=a[k].next)
{
int y=a[k].y;
if(tno.l>=a[k].d&&g[y][tno.l-a[k].d]>g[tno.x][tno.l])
{
g[y][tno.l-a[k].d]=g[tno.x][tno.l];
t.x=y, t.l=tno.l-a[k].d, t.s=tno.s, q.push(t);
}
}
}
printf("impossible\n");
} int main()
{
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)scanf("%d",&c[i]);
for(int i=;i<=m;i++)
{
int x,y,d;
scanf("%d%d%d",&x,&y,&d);x++,y++;
ins(x,y,d);ins(y,x,d);
}
int Q;
scanf("%d",&Q);
while(Q--)
{
scanf("%d%d%d",&C,&st,&ed);st++,ed++;
bfs();
}
return ;
}

poj3635

hdoj3085 这题真是折腾死了。。。题意有点不清(去找discuss)做法是两个轮流走并且枚举时间层数判断,因为有可能某人(几乎是明明)对于当前时间能够到达的点比另一个多得多。恶心的是这个明明同学一秒三步非常难判,一开始我是写了个三步的方向,结果发现这样会穿墙,然后改成三个走一步套在一起,结果发现拓展的时候,当前秒走了1步和2/3步的拓展是有差异的,但是秒数一样就体现不出来,最后解决的方法就是以1/3秒为单位走,圆满解决

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
const int dx[]={,-,,};
const int dy[]={-,,,}; int n,m,gx1,gy1,gx2,gy2;
char ss[][];
struct node
{
int x,y,c;
}list[][];
int d[][][];
bool check(int x,int y,int asd){return <x&&x<=n&&<y&&y<=m&&d[asd][x][y]==-&&ss[x][y]!='X';}
int getdis(int x,int y){return min(abs(gx1-x)+abs(gy1-y),abs(gx2-x)+abs(gy2-y));}
int main()
{
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
int T;
scanf("%d",&T);
while(T--)
{
int gx,gy,bx,by,x,y;gx1=-;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
scanf("%s",ss[i]+);
for(int j=;j<=m;j++)
if(ss[i][j]=='M')bx=i,by=j;
else if(ss[i][j]=='G')gx=i,gy=j;
else if(ss[i][j]=='Z')
{
if(gx1==-)gx1=i,gy1=j;
else gx2=i,gy2=j;
}
} int head[],tail[],dep=; bool bk=false;
head[]=, tail[]=, list[][].x=bx, list[][].y=by;
head[]=, tail[]=, list[][].x=gx, list[][].y=gy;
memset(d,-,sizeof(d)); d[][bx][by]=, d[][gx][gy]=;
if(getdis(bx,by)<=||getdis(gx,gy)<=){printf("-1\n");continue;} while(head[]<tail[]&&head[]<tail[])
{
while(d[][list[][head[]].x][list[][head[]].y]==dep)
{
x=list[][head[]].x,y=list[][head[]].y;
if(d[][x][y]!=-&&d[][x][y]!=-)
{
printf("%d\n",max(d[][x][y]%==?d[][x][y]/:d[][x][y]/+,d[][x][y]/));
bk=true;break;
}
if(getdis(x,y)>*(d[][x][y]/+))
{
for(int k=;k<=;k++)
{
int tx=x+dx[k],ty=y+dy[k];
if(check(tx,ty,)&&getdis(tx,ty)>*(d[][x][y]/+))
{
d[][tx][ty]=d[][x][y]+;
list[][tail[]].x=tx, list[][tail[]].y=ty;
tail[]++;
}
}
}
head[]++;
}
if(bk==true)break; while(d[][list[][head[]].x][list[][head[]].y]==dep)
{
x=list[][head[]].x,y=list[][head[]].y;
if(d[][x][y]!=-&&d[][x][y]!=-)
{
printf("%d\n",max(d[][x][y]%==?d[][x][y]/:d[][x][y]/+,d[][x][y]/));
bk=true;break;
}
if(getdis(x,y)>*(d[][x][y]/+))
{
for(int k=;k<=;k++)
{
int tx=x+dx[k],ty=y+dy[k],dis=getdis(tx,ty);
if(check(tx,ty,)&&dis>*((d[][x][y]+)/))
{
d[][tx][ty]=d[][x][y]+;
list[][tail[]].x=tx, list[][tail[]].y=ty;
tail[]++;
}
}
}
head[]++;
}
if(bk==true)break; dep++;
} /* for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
printf("%d ",d[0][i][j]==-1?9:d[0][i][j]);
printf("\n");
}
printf("\n");
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
printf("%d ",d[1][i][j]==-1?9:d[1][i][j]);
printf("\n");
}*/
if(bk==false)printf("-1\n");
}
return ;
}

hdoj3085

宽搜还是比深搜玩的好一些,但是比较复杂的题细节处理的不好

0x26 广搜变形的更多相关文章

  1. 电路维修 (广搜变形-双端队列bfs)

    # 2632. 「BalticOI 2011 Day1」打开灯泡 Switch the Lamp On [题目描述] 有一种正方形的电路元件,在它的两组相对顶点中,有一组会用导线连接起来,另一组则不会 ...

  2. HDU--杭电--1195--Open the Lock--深搜--都用双向广搜,弱爆了,看题了没?语文没过关吧?暴力深搜难道我会害羞?

    这个题我看了,都是推荐的神马双向广搜,难道这个深搜你们都木有发现?还是特意留个机会给我装逼? Open the Lock Time Limit: 2000/1000 MS (Java/Others)  ...

  3. HDU 5652(二分+广搜)

    题目链接:http://acm.hust.edu.cn/vjudge/contest/128683#problem/E 题目大意:给定一只含有0和1的地图,0代表可以走的格子,1代表不能走的格 子.之 ...

  4. nyoj 613 免费馅饼 广搜

    免费馅饼 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy ...

  5. poj 3984:迷宫问题(广搜,入门题)

    迷宫问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7635   Accepted: 4474 Description ...

  6. poj 3278:Catch That Cow(简单一维广搜)

    Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 45648   Accepted: 14310 ...

  7. 双向广搜 POJ 3126 Prime Path

      POJ 3126  Prime Path Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16204   Accepted ...

  8. 广搜+打表 POJ 1426 Find The Multiple

    POJ 1426   Find The Multiple Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 25734   Ac ...

  9. 双向广搜 codevs 3060 抓住那头奶牛

    codevs 3060 抓住那头奶牛 USACO  时间限制: 1 s  空间限制: 16000 KB  题目等级 : 黄金 Gold   题目描述 Description 农夫约翰被告知一头逃跑奶牛 ...

随机推荐

  1. jupyter在特定环境特定目录中启动

    代码如下: @echo off start %windir%\System32\cmd.exe "/c" D:\Anaconda\Scripts\activate.bat # 启动 ...

  2. .net几种文件下载的方法

    .Net文件下载方式.... 之前在写上传文件.下载文件的时候,发现Response对象里面有好几种下载文件的方式,之后自己亲自实践了这几种方法,记录下以便以后复习... WriteFile文件下载 ...

  3. JavaWeb中使用到的类与接口整理(一)servlet包

    javaweb学了半本,整理了一下Servlet技术模型.servlet容器模型.jsp技术模型中的类与接口,有助于理解web应用中的页面跳转和参数传递,目录: HttpServlet 可作Scope ...

  4. PostgreSQL导出表中数据

    下边的步骤详细讲述了从Postgres数据库中导出数据的方法: (1)将PostgreSQL数据库的psql工具所在的路径添加到系统的环境变量中:(2)运行cmd,在窗口中输入psql,会有提示输入口 ...

  5. 关于 Windows 10 如何扩展分区与合并分区

    前言 相信大部分人都遇见磁盘不够用的问题吧,然后都在后悔当初为什么就给 x 盘分了 10G 的容量吧. 不过没关系,自从 Windows 7 开始( xp 我也不知道有毛有),Windows 自带的磁 ...

  6. 开发一款合格的APP成本费用大概是多少?

    随着移动互联网的发展,APP开发已经成了当下最热门的话题.无数人都盼望做出下一个微信.滴滴打车等等神奇的APP软件.如今,APP开发门槛已经非常低,媒体上也充斥着各种小团队创造奇迹的故事.不过,APP ...

  7. layui 时间控件 单击 年直接赋值

    在 //选中 lay(ul).find('li').on('click', function(){  //结尾处添加 if (options.done === "year") { ...

  8. img标签过滤加fs模块实现图片文件缓存

    方法一:function iCache(selector) { selector.each(function(data) { //msg(data); ! function(data) { var u ...

  9. Java中的常量

    常量的概念 是指在Java程序中固定不变的数据.我们可以理解为是一种特殊的变量,它的值被设定后,在程序运行过程中不允许改变. 常量的分类 整数常量:  所有的整数   例如 100 -100 123 ...

  10. Spring cloud父项目的建立

    1.建立一个maven项目 注意建立项目的时候.选择pom的包 2.添加架包 <project xmlns="http://maven.apache.org/POM/4.0.0&quo ...