我是智障*3,读优写错了调了半天没发现= =

虽然是个最短路却有网络流一般的神建图啊。

首先发现在拐角处转弯是最优的,于是先离散化,然后矩形的四个顶点向距离它最近的上下左右点连边,跑spfa即可。

就是难写啊,还要判断无解:st在矩形里;dis[t]=inf

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<map>
#include<cstdlib>
using namespace std;
const int N=2005;
const long long inf=1e15;
int n,m,sx,sy,tx,ty,a[N],b[N],c[N],d[N],hax,hay,x[N],y[N],mk[N][N],tot,s,t,fx[N],fy[N],h[24005],cnt;
long long dis[24005];
bool v[N][N],fl[N],vis[24005];
map<int,int>mx,my;
struct edg
{
int ne,to;
long long va;
}e[200005];
struct qwe
{
int x,y,id;
qwe(int X=0,int Y=0,int ID=0)
{
x=X,y=Y,id=ID;
}
}p[24005];
bool cmpx(const qwe &a,const qwe &b)
{
return a.x<b.x||(a.x==b.x&&a.y<b.y);
}
bool cmpy(const qwe &a,const qwe &b)
{
return a.y<b.y||(a.y==b.y&&a.x<b.x);
}
int read()
{
int r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
inline long long jl(qwe a,qwe b)
{
return abs(fx[a.x]-fx[b.x])+abs(fy[a.y]-fy[b.y]);
}
void zou(int x,int y,int dx,int dy)
{
x+=dx,y+=dy;
while(!mk[x][y])
{
if(x<1||x>hax||y<1||y>hay)
return;
x+=dx,y+=dy;
}
v[x][y]=1;
}
inline void add(int u,int v,long long w)
{
cnt++;
e[cnt].ne=h[u];
e[cnt].to=v;
e[cnt].va=w;
h[u]=cnt;
}
inline void ins(int u,int v,long long w)
{//cerr<<u<<" "<<v<<" "<<w<<endl;
add(u,v,w);
add(v,u,w);
}
int main()
{
// int T=read();
int T;
scanf("%d",&T);
while(T--)
{
mx.clear(),my.clear();
memset(h,0,sizeof(h));
memset(v,0,sizeof(v));
memset(mk,0,sizeof(mk));
memset(fl,0,sizeof(fl));
memset(vis,0,sizeof(vis));
cnt=0;tot=0,hax=0,hay=0;
// sx=read(),sy=read(),tx=read(),ty=read(),n=read();
scanf("%d%d%d%d%d",&sx,&sy,&tx,&ty,&n);
for(int i=1;i<=n;i++)
{
// a[i]=read(),b[i]=read(),c[i]=read(),d[i]=read();
scanf("%d%d%d%d",&a[i],&b[i],&c[i],&d[i]);
if(a[i]>c[i])
swap(a[i],c[i]);
if(b[i]>d[i])
swap(b[i],d[i]);
x[i]=a[i],x[i+n]=c[i],y[i]=b[i],y[i+n]=d[i];
}
x[2*n+1]=sx,x[2*n+2]=tx,y[2*n+1]=sy,y[2*n+2]=ty;
sort(x+1,x+1+2*n+2);
sort(y+1,y+1+2*n+2);
for(int i=1;i<=2*n+2;i++)
if(i==1||x[i]!=x[i-1])
mx[x[i]]=++hax,fx[hax]=x[i];
for(int i=1;i<=2*n+2;i++)
if(i==1||y[i]!=y[i-1])
my[y[i]]=++hay,fy[hay]=y[i];//cerr<<y[i]<<" "<<my[y[i]]<<endl;
sx=mx[sx],sy=my[sy],tx=mx[tx],ty=my[ty];
mk[sx][sy]=mk[tx][ty]=-1;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i!=j&&a[i]>=a[j]&&b[i]>=b[j]&&c[i]<=c[j]&&d[i]<=d[j])
{
fl[i]=1;
break;
}
for(int i=1;i<=n;i++)
if(!fl[i])
{
a[i]=mx[a[i]],b[i]=my[b[i]],c[i]=mx[c[i]],d[i]=my[d[i]];
//cerr<<a[i]<<" "<<b[i]<<" "<<c[i]<<" "<<d[i]<<endl;
for(int j=a[i];j<=c[i];j++)
mk[j][b[i]]=1,mk[j][d[i]]=2;
for(int j=b[i];j<=d[i];j++)
mk[a[i]][j]=1,mk[c[i]][j]=2;
mk[a[i]][b[i]]=mk[a[i]][d[i]]=mk[c[i]][b[i]]=mk[c[i]][d[i]]=-1;
}
for(int i=1;i<=n;++i)
if((sx>a[i]&&sy>b[i]&&sx<c[i]&&sy<d[i])||(tx>a[i]&&ty>b[i]&&tx<c[i]&&ty<d[i]))
{
puts("No Path");
return 0;
}
for(int i=1;i<=n;i++)
if(!fl[i])
{
zou(a[i],b[i],-1,0),zou(a[i],b[i],0,-1);
zou(a[i],d[i],-1,0),zou(a[i],d[i],0,1);
zou(c[i],b[i],1,0),zou(c[i],b[i],0,-1);
zou(c[i],d[i],1,0),zou(c[i],d[i],0,1);
v[a[i]][b[i]]=v[a[i]][d[i]]=v[c[i]][b[i]]=v[c[i]][d[i]]=1;
}
v[sx][sy]=v[tx][ty]=1;
zou(sx,sy,-1,0),zou(sx,sy,1,0),zou(sx,sy,0,-1),zou(sx,sy,0,1);
zou(tx,ty,-1,0),zou(tx,ty,1,0),zou(tx,ty,0,-1),zou(tx,ty,0,1);
for(int i=1;i<=hax;i++)
for(int j=1;j<=hay;j++)
if(v[i][j])
{
tot++;
p[tot]=qwe(i,j,tot);
if(i==sx&&j==sy)
s=tot;
if(i==tx&&j==ty)
t=tot;
}//cerr<<s<<" "<<t<<endl;
sort(p+1,p+1+tot,cmpx);
for(int i=1,j;i<=tot;i=j)
for(j=i+1;j<=tot&&p[j].x==p[i].x;j++)
if(mk[p[j].x][p[j].y]==-1||mk[p[j-1].x][p[j-1].y]==-1||mk[p[j-1].x][p[j-1].y]>=mk[p[j].x][p[j].y])
ins(p[j-1].id,p[j].id,jl(p[j-1],p[j]));
sort(p+1,p+1+tot,cmpy);
for(int i=1,j;i<=tot;i=j)
for(j=i+1;j<=tot&&p[j].y==p[i].y;j++)
if(mk[p[j].x][p[j].y]==-1||mk[p[j-1].x][p[j-1].y]==-1||mk[p[j-1].x][p[j-1].y]>=mk[p[j].x][p[j].y])
ins(p[j-1].id,p[j].id,jl(p[j-1],p[j]));
queue<int>q;
for(int i=1;i<=tot;i++)
dis[i]=inf;
dis[s]=0;
vis[s]=1;
q.push(s);
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=0;
for(int i=h[u];i;i=e[i].ne)
if(dis[e[i].to]>dis[u]+e[i].va)
{
dis[e[i].to]=dis[u]+e[i].va;
if(!vis[e[i].to])
{
vis[e[i].to]=1;
q.push(e[i].to);
}
}
}
if(dis[t]==inf)
puts("No Path");
else
printf("%lld\n",dis[t]);
}
return 0;
}

bzoj 2304: [Apio2011]寻路【spfa】的更多相关文章

  1. bzoj 2304 [Apio2011]寻路 Dij+模拟+恶心建图

    [Apio2011]寻路 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 624  Solved: 193[Submit][Status][Discus ...

  2. BZOJ 4898 [APIO2017] 商旅 | SPFA判负环 分数规划

    BZOJ 4898 [APIO2017] 商旅 | SPFA判负环 分数规划 更清真的题面链接:https://files.cnblogs.com/files/winmt/merchant%28zh_ ...

  3. bzoj 3875 骑士游戏 - spfa - 动态规划

    Description  [故事背景] 长期的宅男生活中,JYY又挖掘出了一款RPG游戏.在这个游戏中JYY会 扮演一个英勇的骑士,用他手中的长剑去杀死入侵村庄的怪兽. [问题描述] 在这个游戏中,J ...

  4. BZOJ 2763: [JLOI2011]飞行路线 spfa dp

    题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=2763 题解: d[x][kk]表示从s到x用了kk次免费机会的最少花费. 代码: #in ...

  5. BZOJ 2303: [Apio2011]方格染色 题解

    题目大意: 有n*m的方格,中间的数要么是1,要么是0,要求任意2*2的方格中的数异或和为1.已知一部分格子中的数,求合法的填数的方案数. 思路: 由题意得:a[i][j]^a[i][j+1]^a[i ...

  6. bzoj 2303: [Apio2011]方格染色

    传送门 Description Sam和他的妹妹Sara有一个包含n × m个方格的表格.她们想要将其的每个方格都染成红色或蓝色.出于个人喜好,他们想要表格中每个2 × 2的方形区域都包含奇数个(1 ...

  7. BZOJ 2303: [Apio2011]方格染色 [并查集 数学!]

    题意: $n*m:n,m \le 10^6$的网格,每个$2 \times 2$的方格必须有1个或3个涂成红色,其余涂成蓝色 有一些方格已经有颜色 求方案数 太神了!!!花我三节课 首先想了一下只有两 ...

  8. bzoj 2303: [Apio2011]方格染色【并查集】

    画图可知,每一行的状态转移到下一行只有两种:奇数列不变,偶数列^1:偶数列不变,奇数列^1 所以同一行相邻的变革染色格子要放到同一个并查集里,表示这个联通块里的列是联动的 最后统计下联通块数(不包括第 ...

  9. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

随机推荐

  1. SGU 194 无源无汇可行流求解

    题意:n个点,m条边,每条边有容量限制 l--c,每个点满足容量平衡(流入等于流出),求可行解 无源无汇可行流问题,建立以一个超级源点和超级汇点,由于原来最大流问题时候,流量下界其实为0, 所以要转化 ...

  2. Django学习之 - 基础路由系统

    路由系统:URL 1:一个URL对应一个类或函数: url(r'^register',reg.register) 函数写法 url(r'^cbv',reg.cbv.as_view()) 类写法 2:通 ...

  3. HUST 1328 String

    11: KMP next 的强大 题意求前缀在S中出现的次数之和 next[j] 表示 S[0....NEXT[J]]==S[J-NEXT[J].....J]; 于是我们得到..后加入一个字符所得到新 ...

  4. loj6157 A^B Problem (并查集)

    题目: https://loj.ac/problem/6157 分析: 这种树上异或,一般是采用分位考虑,但是这题即使分位,也会发现非常不好处理 这里考虑维护一个点到其根的路径的异或值 用并查集去检测 ...

  5. jfree-生成xy图

    需要导入的包: import org.jfree.chart.*; import org.jfree.chart.plot.PlotOrientation; import org.jfree.data ...

  6. Eclipse通过Maven构建时出现: Fatal error compiling: tools.jar not found: Fatal error compiling: tools.jar not found: C:\Program Files\Java\jre1.8.0_31\..\lib\tools.jar

    错误: Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.5.1:compile (default-com ...

  7. 转: 将Eclipse代码导入到AndroidStudio的两种方式

    评注: 讲解的非常之详细 转自:    http://www.cnblogs.com/ct2011/p/4183553.html 说到使用AndroidStudio,除了新建的项目,我们都会面临的问题 ...

  8. jquery全局变量---同步请求设置

    1.同步 $.ajaxSetup({ async: false }); 2.异步 $.ajaxSetup({   async: true   }); 3.说明:我们一般使用同步完要恢复异步.由于js默 ...

  9. react-redux 之 provider 和 connect

    1.Provider 提供的是一个顶层容器的作用,实现store的上下文传递 2.connect 可以把state和dispatch绑定到react组件,使得组件可以访问到redux的数据 react ...

  10. Vue实例及生命周期

    1,Vue实例生命周期. 有时候,我们需要在实例创建过程中进行一些初始化的工作,以帮助我们完成项目中更复杂更丰富的需求,开发,针对这样的需求,Vue提供给我们一系列的钩子函数 2,Vue生命周期的阶段 ...