Floyd | | jzoj[1218] | | 我也不知道该怎么写

写在前面:老师说这一道题是神题,事实上确实如此,主要是考察对Floyd的理解

******************************题目.txt********************************

跟所有人一样,农夫约翰以着宁教我负天下牛,休教天下牛负我(原文:宁我负人,休教人负我)的伟大精神,日日夜夜苦思生财之道。为了发财,他设置了一系列的规章制度,使得任何一只奶牛在农场中的道路行走,都要向农夫约翰上交过路费。

农场中由N(1 <= N <= 250)片草地(标号为1到N),并且有M(1 <= M <= 10000)条双向道路连接草地A_j和B_j(1 <= A_j <= N; 1 <= B_j <= N)。奶牛们从任意一片草地出发可以抵达任意一片的草地。FJ已经在连接A_j和B_j的双向道路上设置一个过路费L_j(1 <= L_j <= 100,000)。

可能有多条道路连接相同的两片草地,但是不存在一条道路连接一片草地和这片草地本身。最值得庆幸的是,奶牛从任意一篇草地出发,经过一系列的路径,总是可以抵达其它的任意一片草地。

除了贪得无厌,宁智贤都不知道该说什么好。FJ竟然在每片草地上面也设置了一个过路费C_i(1 <= C_i <= 100000)。从一片草地到另外一片草地的费用,是经过的所有道路的过路费之和,加上经过的所有的草地(包括起点和终点)的过路费的最大值。

任劳任怨的牛们希望去调查一下她们应该选择那一条路径。她们要你写一个程序,接受K(1 <= K <= 10,000)个问题并且输出每个询问对应的最小花费。第i个问题包含两个数字s_i和t_i(1 <= s_i <= N; 1 <= t_i <= N; s_i != t_i),表示起点和终点的草地。

考虑下面这个包含5片草地的样例图像:

从草地1到草地2的道路的“边过路费”为3,草地2的“点过路费”为5。

要从草地1走到草地4,可以从草地1走到草地3再走到草地5最后抵达草地4。如果这么走的话,
需要的“边过路费”为2+1+1=4,需要的点过路费为4(草地5的点过路费最大),所以总的花
费为4+4=8。

而从草地2到草地3的最佳路径是从草地2出发,抵达草地5,最后到达草地3。这么走的话,边
过路费为3+1=4,点过路费为5,总花费为4+5=9。

***********************解释**********************************

这道题,麻烦就麻烦在查询点的最大值,那么简单,分成两个进行处理,一个处理正常的Floyd,另外一个加上点,比较他们的大小,

比较的代码姿势是这样的  

for(int t=1;t<=n;t++)
    {
        int k=poi[t].id;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
            {
                a[i][j]=a[j][i]=min(a[i][k]+a[k][j],a[i][j]);
                g[i][j]=g[j][i]=min(g[i][j],a[i][j]+max(poi[t].v,max(w[i],w[j])));
            }
    }

老师说过,外层循环的k有丰富的含义,其中的一层含义就是外层循环循环的是第三个点了,由于最开始给point的代价做了排序,所以最外层循环的时候就应该是point的id

点的循环必定是ijk这三个点的,其余三个点由于经过排序不可能比他大

正确代码的打开姿势如下:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int a[500][500];
int w[500],n;
int m,k;
int g[500][500];
struct dian
{
    int id,v;
}poi[500];
bool mycmp(dian a,dian b)
{
    return a.v<b.v;
}
void init()
{
    cin>>n>>m>>k;
    for(int i=1;i<=n;i++)
        {
            cin>>poi[i].v;
            poi[i].id=i;
            w[i]=poi[i].v;
        }
    sort(poi+1,poi+1+n,mycmp);
    memset(a,10,sizeof(a));
    memset(g,10,sizeof(g));
    for(int i=1;i<=n;i++)
        a[i][i]=0;
    for(int i=1;i<=m;i++)
    {
        int xx,yy,vv;
        cin>>xx>>yy>>vv;
        if(vv<a[xx][yy])
        {
            a[xx][yy]=vv;
            a[yy][xx]=vv;
        }
    }
}

void floyed()
{
    for(int i=1;i<=n;i++)
        g[i][i]=poi[i].v;
    for(int t=1;t<=n;t++)
    {
        int k=poi[t].id;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
            {
                a[i][j]=a[j][i]=min(a[i][k]+a[k][j],a[i][j]);
                g[i][j]=g[j][i]=min(g[i][j],a[i][j]+max(poi[t].v,max(w[i],w[j])));
            }
    }
}
int main()
{
    //freopen("a.in","r",stdin);
    //freopen("a.out","w",stdout);
    init();
    floyed();

    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        cout<<g[i][j]<<‘ ‘;
        cout<<endl;
    }
    for(int i=1;i<=k;i++)
    {
        int st,ed;
        cin>>st>>ed;
        cout<<g[st][ed]<<endl;
    }
    return 0;
}
时间: 2024-12-24 14:43:07

Floyd | | jzoj[1218] | | 我也不知道该怎么写的相关文章

【算法导论】插入排序

排序问题 输入:n个数的一个序列<a1, a2, ..., an> 输出:输入序列的一个排列<b1, b2, ..., bn>,满足 b1 ≤ b2 ≤ ... ≤ bn. 插入排序 对于插入排序,我们将其伪代码命名为Insertion-sort,其中的参数是一个数组A[1..n],包含长度为n的要排序的一个序列.(在代码中,A中元素的数目n用A.length来表示.)该算法原址排序输入的数:算法在数组A中重排这些数,在任何时候,最多只有其中的常数个数字存储在数组外面.在过程Ins

Web前端面试指导(一):写好简历是面试成功的第一步

1.1 简历的作用 简历是求职找工作的敲门砖,优秀的简历更能获取面试的机会 简历是用人单位获取你个人信息的最直接的一种方式 如果没有简历,我们的工作不知从何早起. 1.2 初次写简历存在的困境 以前从来没有写过简历,不知道从哪里写起. 简历的内容不知道写什么,本来语文就不好. 简历写好了不知道可不可以,自己也拿捏不准. 简历常见问题 1)  个人信息简介不完整,甚至连性别都没有写 2)  专业技能描述太细,排序不合理 3)  项目太多或太少,项目描述内容太少, 4)  简历雷同 a)  样式雷同

openwrt路由在中继模式下掉线检测重启脚本

家里的路由中继别人的较远处一个TP-link来上网,但是距离太远,经常断线,断线异常时自己也不知道,于是写个个检测脚本来判断是否掉线 主要是ping上级路由 通了再ping 114dns没接触过shell脚本,逻辑都没怎么搞好直接上来一个while大循环加多重if 写得很烂,将就着用好了 echo 'hello world' while test "1" = "1" do # do something #第一次ping 上级192.168.1.1 if ping -

这些年经历的技术变迁与沉浮

最近又从头到尾写了一个小 java web 应用,上一次完整的写 web 应用程序已是三年前了, 毕竟近年都专注在后端服务架构上,而较少有机会从前端到后端写一个完整的 web 程序. 而每次有这样的机会,我总会去跟进使用下最新的 web 技术来开发,毕竟三年前称手的技术工具如今看来已经老态龙钟, 回顾这些年的技术变迁与沉浮,不禁感慨. C/S 的末路 在我进入程序员这个职业时,主流的企业应用开发还在 C/S 时代末期,而 B/S 架构方兴未艾. 主流的企业系统架构都是 C/S 的.如上图,数据库

写文档的一些感触

软工写文档也有一个多星期了,还没有写完,感觉太慢了~ 对于软工文档,最大的感觉就是不知道该怎么写.问过一个师哥,师哥说这次写主要是为了让我们先了解一下写文档,现在让我们真正写那肯定是写不好的.后面还会有项目来练习的. 真正优秀的程序员应该不单是编程高手,同时也应该是写文档的高手.大多数程序员是不喜欢写文档的.文档种类多,要求多.需求的改变和代码的改变都会让文档如同一张过时的废纸一样.很多程序员不写文档照样能编出程序来,文档的好处更多的体现在公司.用户和后续程序员身上.这样即使程序员走了,只要有文

Spark用Java实现二次排序的自定义key

本人在研究Spak,最近看了很多网上的对于SPARK用Java实现二次排序的方法,对于自定义key的做法 基本上都是实现Ordered<>接口,重写$greater.$greater$eq.$less.$less$eq.compare.compareTo方法,定义hashCode.equals····· 感觉好麻烦,其实我们自定义key只是用了里面的compareTo方法,其他的$greater.$greater$eq.$less.$less$eq.compare 不用做任何改动,hashCo

最新的建站(小说站)分享(一)--后台模板及网站配置

最近老板叫我们自己写一个站,练练手.不能让我们闲着...我想到底该些什么呢,想到自己平时挺喜欢看小说的,就决定写一个小说站了. 不多说,想好就立即行动,开始没什么头绪,想了半天不知道该怎么写.于是乎就在网上搜了好多相关的资料,和我们技术总监讨论了好久,现在终于有点眉目了,下面就开始向大家介绍一下我写小说站的经历,只能作为新手参考,大神轻点喷! 小说站说难不难,说简单也没辣么简单.挺适合练手的,小说站整体来说要比企业站难一点,里面的分类是重头戏,小说种类太多,要分很多类,这里的分类以后再说. 这里

JS 正则表达式否定匹配(正向前瞻)

引言:JS 正则表达式是 JS 学习过程中的一大难点,繁杂的匹配模式足以让人头大,不过其复杂性和其学习难度也赋予了它强大的功能.文章从 JS 正则表达式的正向前瞻说起,实现否定匹配的案例.本文适合有一定 JS 正则表达式基础的同学,如果对正则表达式并不了解,还需先学习基础再来观摩这门否定大法. 一.标签过滤需求 不知道大家在写JS有没有遇到过这样的情况,当你要处理一串字符串时,需要写一个正则表达式来匹配当中不是 XXX 的文本内容.听起来好像略有些奇怪,匹配不是 XXX 的内容,不是 XXX 我

jQuery Ajax 全解析

jQuery Ajax 全解析 本文地址: jQuery Ajax 全解析 本文作者:QLeelulu 转载请标明出处! jQuery确实是一个挺好的轻量级的JS框架,能帮助我们快速的开发JS应用,并在一定程度上改变了我们写JavaScript代码的习惯. 废话少说,直接进入正题,我们先来看一些简单的方法,这些方法都是对jQuery.ajax()进行封装以方便我们使用的方法,当然,如果要处理复杂的逻辑,还是需要用到jQuery.ajax()的(这个后面会说到). 1. load( url, [d