codevs1024一塔湖图(丧心病狂的建图)

/*
丧心病狂的最短路 关键是建图
根据题目中给的路 拆出节点来 建图  (i,j) -->(j-1)*n+i
然后根据障碍 把死路 湖覆盖的dis改变成极大值
然后Floyd
然后 然后就没有然后了....
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 99999999;
using namespace std;
int g[150][150],x[11],y[11],s,n,m,t,k;
void Input()
{
    cin>>n>>m>>t>>k;
    s=n*m;//图中节点个数
    int i,j;
    for(i=1;i<=n;i++)
      cin>>x[i];
    for(i=1;i<=m;i++)
      cin>>y[i];
}
void Build()
{
    int i,j;
    memset(g,127/3,sizeof(g));//初始化
    for(i=1;i<=s;i++)
      g[i][i]=0;
    for(i=1;i<=n;i++)//先按给出的路建一遍
      for(j=1;j<=m;j++)//以(i,j)为基点 四个方向建图
        {
          if(i>1)g[(j-1)*n+i][(j-1)*n+i-1]=x[i]-x[i-1];//向左
          if(j>1)g[(j-1)*n+i][(j-1-1)*n+i]=y[j]-y[j-1];//向上
          if(i<n)g[(j-1)*n+i][(j-1)*n+i+1]=x[i+1]-x[i];//向右
          if(j<m)g[(j-1)*n+i][(j-1+1)*n+i]=y[j+1]-y[j];//向下
        }
    int x1,y1,x2,y2;
    for(i=1;i<=t;i++)//处理路   (有点问题好像 不能覆盖每条路里面的点- -)
      {
          cin>>x1>>y1>>x2>>y2;
          g[(y1-1)*n+x1][(y2-1)*n+x2]=maxn;
          g[(y2-1)*n+x2][(y1-1)*n+x1]=maxn;
      }
    for(int l=1;l<=k;l++)//处理湖 注意:边界可以走
      {
          cin>>x1>>x2>>y1>>y2;
          for(i=x1;i<=x2-1;i++)//处理x方向的 只向右延伸
            for(j=y1+1;j<=y2-1;j++)
              {
                g[(j-1)*n+i][(j-1)*n+i+1]=maxn;
                g[(j-1)*n+i+1][(j-1)*n+i]=maxn;
            }
        for(j=y1;j<=y2-1;j++)//处理y方向的 只向下延伸
          for(i=x1+1;i<=x2-1;i++)
            {
              g[(j-1)*n+i][(j-1+1)*n+i]=maxn;
              g[(j-1+1)*n+i][(j-1)*n+i]=maxn;
            }
      }
}
void Floyd()
{
    int i,j,k;
    for(k=1;k<=s;k++)
      for(i=1;i<=s;i++)
        for(j=1;j<=s;j++)
          if(g[i][j]>g[i][k]+g[k][j])
            g[i][j]=g[i][k]+g[k][j];

}
void Printf()
{
    int x1,y1,x2,y2;
    cin>>x1>>y1>>x2>>y2;
    cout<<g[(y1-1)*n+x1][(y2-1)*n+x2];
}
int main()
{
    Input();
    Build();
    Floyd();
    Printf();
    return 0;
}
时间: 2024-10-09 09:57:33

codevs1024一塔湖图(丧心病狂的建图)的相关文章

NYOJ 20 吝啬的国度 【BFS+链式前向星建图,Vector建图】

吝啬的国度 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来.现在,Tom在第S号城市,他有张该国地图,他想知道如果自己要去参观第T号城市,必须经过的前一个城市是几号城市(假设你不走重复的路). 输入 第一行输入一个整数M表示测试数据共有M(1<=M<=5)组 每组测试数据的第一行输入一个正整数N(1<=N<=100000)和一个正整数S(1<=S<=100000

HDU1535Invitation Cards(有向图,正向建图和反向建图各spfa一次)

Invitation Cards Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 2374    Accepted Submission(s): 1151 Problem Description In the age of television, not many people attend theater performances.

一塔湖图(codevs 1024)

题目描述 Description 小松所在的PK大学校园又称作燕园,是一个十分美丽的校园.有博雅塔,未名湖,亚洲最大的高校图书馆,人称“一塔湖图”.但是由于燕园的历史比较悠久,所以很多的老房子都要不断地维修(就像故宫现在在维修一样),这导致了燕园中的一些路是禁止通行的. 十分有趣的是,整个燕园的形状是南北朝向的一个四边形,而燕园的建筑格局也十分有规则.你可以假设他被n条横向的路和m条纵向的路分割成了大大小小的很多块区域.禁止通行的那些路正好在两个相邻的交叉路口之间.小松十分想知道,他要从他宿舍所

UESTC30-最短路-Floyd最短路、spfa+链式前向星建图

最短路 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的T-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据. 每组数据第一行是两个整数NN ,MM (N≤100N≤100 ,M≤10000M≤1000

poj1122 FDNY to the Rescue!(dij+反向建图+输出路径)

题目链接:poj1122 FDNY to the Rescue! 题意:给出矩阵,矩阵中每个元素tij表示从第i个交叉路口到第j个交叉路口所需时间,若tij为-1则表示两交叉路口之间没有直接路径,再给出火警位置所在的交叉路口 和 一个或多个消防站所处的交叉路口位置.输出要求按消防站到火警位置所需时间从小到大排列,输出信息包括消防站位置(初始位置),火警位置(目标位置),所需时间,最短路径上每个交叉路口. 题解:反向建图,从火警位置求一次最短路,求最短路时记录路径,按时间从小到大输出. 1 #in

HDU5772 String problem 最大权闭合图+巧妙建图

题意:自己看吧(不是很好说) 分析: 网络流:最大权闭合子图. 思路如下: 首先将点分为3类 第一类:Pij 表示第i个点和第j个点组合的点,那么Pij的权值等于w[i][j]+w[j][i](表示得分) 第二类:原串中的n个点每个点拆出一个点,第i个点权值为 –a[s[i]] (表示要花费) 第三类:对于10种字符拆出10个点,每个点的权值为  -(b[x]-a[x]) 那么我们可以得到一个关系图 ,对于第一类中的点Pij,如果想要选择Pij,你就必须要选中第二类中的点i和j,对于第二类中的点

4205: 卡牌配对 最大流+建图技巧

很明显该题应该是二分图最大匹配,但该题不可能N^2建图,那么我们要怎么办呢?而且有三个属性. 注意到 Ai <= 200 而且 200 以内的质数只有49个,那么我们就可以对着仅有的49个质数下毒手了.很明显如果 Ai 与 Aj 不互质的话, 两者应该有一个共同质因子. B和C同理. 那么我们可以在S集和T集中间建3层质因子的墙,分别为A和B, B和C, C和A. 只有当 Ai 被第 x 个质因子整除, Bi 被第 y 个质因子整除时, 我们从 i 往 P[0][x][y] 连边. 其他同理.

HDU5669 Road 分层最短路+线段树建图

分析:(官方题解) 首先考虑暴力,显然可以直接每次O(n^2) ?的连边,最后跑一次分层图最短路就行了. 然后我们考虑优化一下这个连边的过程 ,因为都是区间上的操作,所以能够很明显的想到利用线段树来维护整个图, 连边时候找到对应区间,把线段树的节点之间连边.这样可以大大缩减边的规模,然后再跑分层图最短路就可以了. 但是这样建图,每一次加边都要在O(logn)个线段树节点上加边,虽然跑的非常快,但是复杂度仍然是不科学的. 为了解决边的规模的问题,开两棵线段树,连边时候可以新建一个中间节点,在对应区

HDU3572Task Schedule(最大流 ISAP比较快)建图方法不错

Task Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5007    Accepted Submission(s): 1636 Problem Description Our geometry princess XMM has stoped her study in computational geometry t