点击浏览题目大意:

/Files/g0feng/胡老师的跨国逃亡.doc

关于这道题,是我在学习图论时一本参考书上看到的题目,觉得有趣,就写了写。

大概思路:第一次我思考时,首先是找到A国中的边界点,然后找出1到边界点距离的最小值,然后通过通过spfa枚举边界点的去找离2的最小值,但这样应该会超时。于是我将地图预处理了一下,首先找到1离A中所有的点的最短路,然后去找2离B中所有的点的最短路。这里需要注意一下的就是怎么样去保证d[i]一定是代表一个国家之内的最小值,这里我们可以加一个判断,即vis[v] == f。记得把初始值d[src]置为0,这样,我们最后求得的距离一定是国家与国家之间的最小值。

然后怎么去找边界点呢?我们可以另外开一个数组来存储边,这样只要vis[u] != vis[v]的话,说明它就是边界点,由于d[i]一定代表国家与国家之间的最小值,然后通过枚举判断最小值即可。

CODE:

#include <iostream>
#include <cstring>
#include < string>
#include <cstdio>
#include <cstdlib>
#include <map>
#include <queue>
using  namespace std;

const  int MAXN =  3010;
const  int MAXM =  500510;
const  int INF =  0x3f3f3f3f;

struct Edge
{
     int u, v, w;
     int next;
}edge[MAXN], Save[MAXN]; 
                // Save储存边的值
int n, m;
int cnt;

int first[MAXN], d[MAXN];
int vis[MAXN];

void init()
{
    cnt =  0;
    memset(first, - 1,  sizeof(first));
    memset(vis,  0,  sizeof(vis));
    memset(d, INF,  sizeof(d));
}

void read_graph( int u,  int v,  int w)
{
    edge[cnt].v = v, edge[cnt].w = w;
    edge[cnt].next = first[u], first[u] = cnt++;
}

void read_case()
{
    init();
     for( int i =  1; i <= m; i++)
    {
         int u, v, w;
        scanf( " %d%d%d ", &u, &v, &w);
        read_graph(u, v, w);
        read_graph(v, u, w);
        Save[i].u = u, Save[i].v = v, Save[i].w = w;
    }
     int f;
     for( int i =  1; i <= n; i++)
    {
        scanf( " %d ", &f);
        vis[i] = f;
    }
}

void spfa( int src,  int f)
{
    queue< int> q;
     bool inq[MAXN] = { 0};
    d[src] =  0;    // 初始点需要置0 
    q.push(src);
     while(!q.empty())
    {
         int x = q.front(); q.pop();
        inq[x] =  0;
         for( int e = first[x]; e != - 1; e = edge[e].next)
        {
             int v = edge[e].v, w = edge[e].w;
             if(d[v] > d[x] + w && vis[v] == f)  // 枚举每个A或者B国家中到源点的最短距离
            {
                d[v] = d[x] + w;
                 if(!inq[v])
                {
                    inq[v] =  1;
                    q.push(v);
                }
            }
        }
    }
}

void solve()
{
     int ans = INF;
    read_case();
    spfa( 1,  1);
    spfa( 2,  2);
     for( int i =  1; i <= m; i++)
    {
         int u = Save[i].u, v = Save[i].v, w = Save[i].w;  // 储存边,枚举时需要用到 
         if(vis[u] != vis[v])
        {
             if(d[u] + d[v] + w < ans)
            {
                ans = d[u] + d[v] + w;
            }
        }
    }
     if(ans < INF)
    {
        printf( " %d\n ", ans);
    }
     else printf( " -1\n ");
}

int main()
{
     while(~scanf( " %d%d ", &n, &m))
    {
        solve();
    }
     return  0;
}

转载于:https://www.cnblogs.com/g0feng/archive/2012/11/14/2769665.html

DUT 胡老师的跨国逃亡相关推荐

  1. 天生励志难自弃—记新东方胡平老师的美丽人生

    长沙新东方英语的明星老师--胡平         听别人的故事,想自己的人生.            这个寒假我在长沙新东方英语学校的课堂上认识了胡平老师,她对词汇深入的研究和不拘一格的授课方式,给人 ...

  2. 胡百敬老师谈SQL Server 2005

    博文专访--与作者面对面 胡百敬老师谈SQL Server 2005 针对胡百敬老师的新书<SQL Server 2005数据库开发详解>的出版,博文视点对胡百敬老师进行了专访,以飨读者. ...

  3. DataPipeline |《Apache Kafka实战》作者胡夕:Apache Kafka监控与调优

    胡夕,<Apache Kafka实战>作者,北航计算机硕士毕业,现任某互金公司计算平台总监,曾就职于IBM.搜狗.微博等公司.国内活跃的Kafka代码贡献者. 前言 虽然目前Apache ...

  4. texlive写论文源代码_Texlive 2020 编译胡伟《latex2e完全学习手册》后记字体右倾90度...

    ## 编译环境 操作系统 * [x] Windows 7/8/10 * [ ] macOS * [ ] Linux `若需勾选,请把[ ]改成[x]` Tex发行版 * [x] TexLive `20 ...

  5. 胡浩:人人能学的AI《从零开始机器学习》苏州.NET俱乐部课程分享

    [课程名称] <从零开始机器学XI> [老师介绍] 胡浩,微软最有价值专家(MVP,十余届多方向),微软技术大会讲师.云.数据中心基础架构.全栈虚拟化.企业移动管理等领域的架构师及顾问.A ...

  6. 计算机学院优秀老师颁奖词,给老师的颁奖词

    第1篇:写给音乐老师的颁奖词 颁奖词一:音乐老师的颁奖词 美妙的音符,优美的乐章,熏陶着我们的心灵.他与我们心贴心的歌唱,用一本乐谱,一台电子琴,教会我们许许多多脍炙人口的音乐.他就是xx老师. 颁奖 ...

  7. 山东大学计算机专业知名教授,胡思煌 山东大学主页平台管理系统--胡思煌

    个人简介 胡思煌,山东大学网络空间安全学院教授.德国洪堡基金获得者.山东大学杰出中青年学者.泰山学者青年专家.主要从事组合数学与信息交叉领域的研究,包括代数组合.编码与信息论.球与格填充等方向.已在国 ...

  8. 全媒体运营师胡耀文教你:社群运营这6种裂变模型,你掌握了吗?

    社群运营,无非就是将有共同性的一群人拉到群中,抛出话题,引发大家讨论活跃一下社群氛围,但是做起来才知道并非这么简单.社群运营,一门看似极其简单的事情,里面却蕴藏着不小的学问. 在经营社群的过程中,我们 ...

  9. 高中日语老师教师资格证考试成功通过前辈备考经验分享

    2021年吉林省(笔试)+江西省(面试) 高中日语教师资格证 个人背景 吉林省某大学,日语专业. 时间线 2020年11月通过笔试, 2021年1月通过面试. 笔试单科成绩两年有效.报考"* ...

最新文章

  1. linux 网络dma驱动,S3C2410的Linux下DMA驱动程序开发
  2. es6 async函数实例:按顺序完成异步操作
  3. linux ftp验证指令,linux FTP常用指令说明
  4. Vue.js学习总结(2)——Vue.js2.X + ElementUI开发环境搭建
  5. 【104】Maven3.5.0结合eclipse使用,提示Lambda expressions are allowed only at source level 1.8 or above错误的解决方法
  6. 电路故障检测与调试分析
  7. 智能网联汽车 自动驾驶功能场地试验方法及要求
  8. 弹性法计算方法的mck法_经济学原理中讲到的中点法计算需求弹性是怎么回事
  9. 移动端实现点击按钮复制文本功能
  10. LM2596/LM2596S多路降压稳压DC-DC开关电源芯片详解(第二部分:电路设计)(12V转5V、12V转3.3V、任意电压转任意电压)
  11. 从钢铁侠看Decorator 装饰者模式
  12. python 方差齐性检验_Python数据科学:正态分布与t检验
  13. 算法入门-合并二叉树
  14. Js定时器倒计时及堆叠问题解析(附源码)
  15. 从苹果官网细看20年设计变迁史
  16. 计算机导论期末复习题
  17. 在VMware虚拟机上安装统信UOS系统
  18. html5字体加重,javascript – Html5画布字体重量渲染比它应该重得多
  19. oracle查询历史会话,如何查询以往的session历史信息
  20. 链表的基本操作--c语言

热门文章

  1. 护士站计算机管理制度选择题,护士站工作岗位职责及常见问题的处理
  2. 判断一个年是否为闰年
  3. Microsoft VBScript 运行时错误 错误 '800a01a8' 缺少对象: ''
  4. 【BJOI2015】【BZOJ4337】树的同构
  5. 用STM32实现FFT
  6. centos永久修改主机名以及etc/hosts文件详解
  7. 基于GIS技术的环境领域应用
  8. 电商产品评论数据情感分析
  9. ELK---搭建(LinuxWindows)
  10. No label views point to this text field with an android:labelFor=@+id/@+id/*** attribute