电路维修 这道题虽然乍一看就会想斜对角的两点之间边权受初始电路的影响要么为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. swiper套路

    swiper插件 quick start 基本结构 <div class="swiper-container"> <div class="swiper- ...

  2. 二.Windows I/O模型之异步选择(WSAAsyncSelect)模型

    1.基于windows消息为基础的网络事件io模型.因此我们必须要在窗口程序中使用该模型.该模型中的核心是调用WSAAsyncSelect函数实现异步I/O. 2.WSAAsyncSelect函数:注 ...

  3. HttpSampler进行模拟webservice接口

    webservice接口,使用HttpSampler进行模拟,注意点说明: 1. 2. 3. 4. 如果没有头信息,soap1.0的版本会返回错误body,如下, PS:soap1.2存在细微差别  

  4. java操作Excel的poi基础语法

    创建一个简单的实列 package com.java.poi; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache ...

  5. Python笔记16-------类

    1.类的定义 (1)#括号中要加入父类,如果没有则默认为object,万类之源 class 类名(父类): '类的文档字符串' 类体代码 若类什么都不做,则类只作为命名空间,仅作为一个容器. (2)类 ...

  6. PART 5: INTEGRATING SPRING SECURITY WITH SPRING BOOT WEB

    转自:http://justinrodenbostel.com/2014/05/30/part-5-integrating-spring-security-with-spring-boot-web/ ...

  7. 漫谈 Google 的 Native Client(NaCl) 技术(二)---- 技术篇(兼谈 LLVM)

    转自:http://hzx5.blog.163.com/blog/static/40744388201172531637729/ 漫谈 Google 的 Native Client(NaCl) 技术( ...

  8. 实现el-dialog的拖拽,全屏,缩小功能

    基于el-dialog, 封装了一下.,实在懒得写,所以直接把代码 粘出来了 大概粘了一下效果.自己体会把. 组件使用 <el-dialog v-dialogDrag ref="xhz ...

  9. HDU-1695 GCD(求一个区间内与一个数互质的个数)

    题意: 给你一个T,是样例的个数,接下来是五个数l1,r1,l2,r2,k  前四个数代表两个区间(l1,r1),(l2,r2)这个题l1=1,l2=1; 取x1属于(1,r1),x2属于(1,r2) ...

  10. bzoj 2834: 回家的路

    题目 F.A.Qs Home Discuss ProblemSet Status Ranklist Contest 入门OJ ModifyUser  DCOI Logout 捐赠本站 Notice:1 ...