P2176 [USACO14FEB]路障Roadblock

题目描述

每天早晨,FJ从家中穿过农场走到牛棚。农场由 N 块农田组成,农田通过 M 条双向道路连接,每条路有一定长度。FJ 的房子在 1 号田,牛棚在 N 号田。没有两块田被多条道路连接,以适当的路径顺序总是能在农场任意一对田间行走。当FZ从一块田走到另一块时,总是以总路长最短的道路顺序来走。

FJ 的牛呢,总是不安好心,决定干扰他每天早晨的计划。它们在 M 条路的某一条上安放一叠稻草堆,使这条路的长度加倍。牛希望选择一条路干扰使得FJ 从家到牛棚的路长增加最多。它们请你设计并告诉它们最大增量是多少。

输入输出格式

输入格式:

第 1 行:两个整数 N, M。

第 2 到 M+1 行:第 i+1 行包含三个整数 A_i, B_i, L_i,A_i 和 B_i 表示道路 i 连接的田的编号,L_i 表示路长。

输出格式:

第 1 行:一个整数,表示通过使某条路加倍而得到的最大增量。

输入输出样例

输入样例#1:

5 7
2 1 5
1 3 1
3 2 8
3 5 7
3 4 3
2 4 7
4 5 2
输出样例#1:

2

说明

【样例说明】

若使 3 和 4 之间的道路长加倍,最短路将由 1-3-4-5 变为 1-3-5。

【数据规模和约定】

对于 30%的数据,N <= 70,M <= 1,500。

对于 100%的数据,1 <= N <= 100,1 <= M <= 5,000,1 <= L_i <= 1,000,000。

先跑一遍最短路,然后记录最短路上的每一条路径,然后暴力枚举每一条路径将其路径长度增为两倍,然后在跑最短路,抛出后的最短路与第一次的最短路相减即为答案

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 5100
using namespace std;
queue<int>q;
bool vis[N];
,ans1,ans2,sum;
int fa[N],dis[N],head[N],node[N],num[N];
int read()
{
    ,f=; char ch=getchar();
    ') ch=getchar();
    +ch-',ch=getchar();
    return x*f;
}
struct Edge
{
    int to,dis,next,from;
}edge[N<<];
int add(int x,int y,int z)
{
    tot++;
    edge[tot].to=y;
    edge[tot].dis=z;
    edge[tot].next=head[x];
    head[x]=tot;
}
int spfa(int s)
{
    memset(vis,,sizeof(vis));
    memset(dis,0x3f3f3f3f,sizeof(dis));
    vis[s]=;
    while(!q.empty())
    {
        int x=q.front();q.pop();vis[x]=false;
        for(int i=head[x];i;i=edge[i].next)
        {
            int to=edge[i].to;
            if(dis[to]>dis[x]+edge[i].dis)
            {
                dis[to]=dis[x]+edge[i].dis;
                fa[to]=x;num[to]=i;
                if(vis[to]) continue;
                q.push(to),vis[to]=true;
             }
        }
    }
}
int main()
{
    n=read(),m=read();
    ;i<=m;i++)
    {
        x=read(),y=read(),z=read();
        add(x,y,z),add(y,x,z);
    }
    memset(fa,-,sizeof(fa));
    spfa(),ans1=dis[n];
    ;i=fa[i])
      node[++sum]=num[i];
    ;i<=sum;i++)
    {
        edge[node[i]].dis*=;
        edge[node[i]^].dis*=;
        spfa();
        ans2=max(ans2,dis[n]);
        edge[node[i]].dis/=;
        edge[node[i]^].dis/=;
    }
    printf("%d",ans2-ans1);
    ;
}

最新文章

  1. JAVA中使用FTPClient实现文件上传下载实例代码
  2. 前端开发利器-Brackets IDE
  3. cocos2dx游戏开发——微信打飞机学习笔记(六)——PlayerLayer的搭建
  4. dubbo spring2.5.6与spring 3冲突解决
  5. C51 库函数(3)
  6. 【最短路】Vijos P1046 观光旅游
  7. hdu 4961 Boring Sum(数学题)
  8. 将dom4j格式化为标准的xml字符串
  9. Archlinux 中安装 LyX
  10. css动画属性--轮播图效果
  11. day-6 机器学习概念及应用
  12. Spring MVC 响应视图(六)
  13. mybatis分页查询的万能模板
  14. ccf--20140303--命令行选项
  15. redis error It was not possible to connect to the redis server(s); to create a disconnected multiplexer, disable AbortOnConnectFail. SocketFailure on PING
  16. 【前端vue开发】vue子调父 $emit (把子组件的数据传给父组件)
  17. Running CMD.EXE as Local System(转)
  18. struts2必要的包
  19. Nginx负载均衡+代理+ssl+压力测试
  20. jQuery插件学习笔记

热门文章

  1. Win2008 Server配置PHP环境
  2. Thinkphp5 的常用连式查询
  3. Django 惰性机制
  4. Leetcode 81. 搜索旋转排序数组 II
  5. Django 二——models(admin、ORM),一对一、一对多、多对多操作,all、values、value_list的对比
  6. Python_Virtualenv及Pycharm配置
  7. Python爬虫selenium、PhanmJs
  8. 九度oj 题目1457:非常可乐
  9. 【转】Bad Smell(代码的坏味道)
  10. 【Luogu】P3971Alice And Bob(贪心)