Problem C: 先有durong后有天

Time Limit: 3 Sec  Memory Limit: 128 MB
Submit: 59  Solved: 16
[Submit][Status][Web Board]

Description

durong同学最近斥巨资买了一座岛,这座岛上有n个部落,durong同学在这n个部落之间修了m条道路,使得任意两个部落都能互相到达,不过最近durong
有点缺钱,所以他打算卖掉一些道路(也就是拆掉这些道路,每条道路都能卖一个金币),不过拆掉一些道路后还必须满足从s1到e1的时间不超过t1,从s2到e2
的时间不超过t2这两个条件,求最多能卖得多少金币

(每条路长度也是1)

Input

多组输入
第一行有两个整数n,m(1 ≤ n ≤ 3000, n-1 ≤ m ≤ min(3000,n*(n-1)/2) )。
接下来m行,每行有两个整数 ai, bi (1 ≤ ai, bi ≤ n, ai ≠ bi),表示ai和bi之间有一条道路。
输入保证是一个连通图。
最后两行每行有三个整数s1, e1, t1和 s2, e2, t2, (1 ≤ si, ei ≤ n, 0 ≤ ti ≤ n)

Output

输出一个整数,表示最多可以破坏的道路数目,如果没有解,输出-1。

Sample Input

5 4
1 2
2 3
3 4
4 5
1 3 2
3 5 2

Sample Output

0

HINT

解题思路:要求能卖金币的最大数,即要我们求出最多能拆多少条路,那我们分别求出s1-e1,s2-e2的最短路径即可,然后再用总路径长度减去它们,但是可能这两条路有共同的一段路经,因此有可能例外这两条路的长度减去交叉的长度比那两条最短路的总长度更短,因为数据不是很大,所以我们可以暴力枚举O(n^2)下公共部分,算出最终的最小值,因此我们在求最短路的时候要求出任意两点的最短路这样才能在枚举时保证距离是最短的,因为每条路的距离都为1,因此我们就可以bfs一下就可以解决了O(n^2)。最后还有一个很难想到的情况:就是这这些路都是无向的,因此在枚举时注意枚举两个方向!!!
邻接表的实现
AC代码:
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<math.h>
#include<time.h>
#include<map>
#include<string>
#include<algorithm>
#include<set>
#include<queue>
#define N 3010const int INF = 1e9;using namespace std;int st[3], en[3], t[3], cnt;
int dist[N][N];
int head[N], vis[N];
int n, m, x, y, z, len, flag;struct Edge
{int End;int next;
}e[2*N];void Add_Edge(int u, int v) //用邻接表实现每条路的连通
{e[cnt].End = u;e[cnt].next = head[v];head[v] = cnt ++;
}void bfs()
{for(int i = 1; i <= n; i ++) { //求每两点的最短路dist[i][i] = 0;memset(vis, 0, sizeof(vis));queue<int> q;q.push(i);vis[i] = 1;while(!q.empty()) {int cur = q.front();q.pop();for(int j = head[cur]; j != -1; j = e[j].next) {int v = e[j].End;if(vis[v]) continue;int next = v;dist[i][v] = dist[i][cur] + 1;q.push(next);vis[v] = 1;}}}
}int main()
{while(~scanf("%d%d", &n, &m)){flag = 0, len = 0;cnt = 0;memset(head, -1, sizeof(head));for(int i = 1; i <= n; i ++)for(int j = 1; j <= n; j ++)dist[i][j] = INF;for(int i = 0; i < m; i ++) {scanf("%d%d", &x, &y);Add_Edge(x, y);Add_Edge(y, x);}bfs();for(int i = 1; i <= 2; i ++) {scanf("%d%d%d", &st[i], &en[i], &t[i]);if(t[i] < dist[st[i]][en[i]]) flag = 1; //不能超过限制条件len += dist[st[i]][en[i]];}if(flag) {printf("-1\n"); continue;}for(int i = 1; i <= n; i ++) //枚举交叉路段for(int j = 1; j <= n ;j ++) {x = dist[st[1]][i] + dist[i][j] + dist[j][en[1]];y = dist[st[2]][i] + dist[i][j] + dist[j][en[2]]; //y、z为两个方向z = dist[en[2]][i] + dist[i][j] + dist[j][st[2]];if(x <= t[1] && y <= t[2]) //不能超过限制条件len = min(len, x + y - dist[i][j]);if(x <= t[1] && z <= t[2])len = min(len, x + z - dist[i][j]);}printf("%d\n", m - len);}return 0;
}

CSUST选拔赛题解之-Problem C: 先有durong后有天相关推荐

  1. CSUST选拔赛题解之-Problem H: 逃出监狱

    Problem H: 逃出监狱 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 116  Solved: 42 [Submit][Status][Web ...

  2. CSUST选拔赛题解

    ---恢复内容开始--- A:哭泣的阿木木 题目链接:http://csustacm.com:4803/contest/26/problem/J 思路:这是一个很裸的线段树+lazy数组标记,直接用板 ...

  3. 北京信息科技大学第十三届程序设计竞赛暨ACM选拔赛题解

    北京信息科技大学第十三届程序设计竞赛暨ACM选拔赛题解 A lzh的蹦床 B 所谓过河 C 旅行家问题1 D 旅行家问题2 E 小菲和Fib数列 F 好玩的音乐游戏 G ranko的手表 H 字母收集 ...

  4. XMU区域赛选拔赛题解

    XMU区域赛选拔赛题解 B.是谁打了奶奶 Description 最近发生了一起骇人听闻的打奶奶事件,凶手就是--惊奇队长. 惊奇队长是在电车上打的奶奶,那么我们就来看一个和电车有关的问题. 某市修建 ...

  5. CSUST 集训队选拔赛题解

    选拔赛的题解,~~~ 题目链接:请点击 A题 素数筛 + 线段树(树状数组) 先用素数筛打表,然后线段树更新,遍历求出值,O(1)查询即可 AC代码: /*num数组 是把记录 数是否存在 存在即为1 ...

  6. SWPU 2021年团队程序设计天梯赛选拔赛 题解

    补题场链接:https://pintia.cn/problem-sets/1373141720280027136 本次选拔赛除后三题以外,其余的题目难度都不是很大,简单筛选一下大家的基础.请大家这段时 ...

  7. 2018 焦作站亚洲区域赛校内选拔赛题解

    SUST_2018 焦作站亚洲区域赛校内选拔赛 A.高速        by yoyo tag:图论.最短路 //最短路 #include<bits/stdc++.h> using nam ...

  8. 2018中国大学生程序设计竞赛-网络选拔赛题解

    以下所有AC题解程序来自"仙客传奇"团队. A. Buy and Resell AC的C++语言程序: #include<iostream> #include<c ...

  9. SUST_2018 焦作站亚洲区域赛校内选拔赛题解

    SUST_2018 焦作站亚洲区域赛校内选拔赛 A.高速        by yoyo tag:图论.最短路 //最短路 #include<bits/stdc++.h> using nam ...

最新文章

  1. OpenCV+python:图像二值化
  2. Weblogic项目部署教程
  3. xampp配置xdebug
  4. C# 判断一字符串是否为合法数字(正则表达式)
  5. React之初始化state
  6. Java讲课笔记17:Lambda表达式
  7. Linux内核TCP/IP协议栈运行时序 | 配图
  8. php推送系统,php 如何加入即时推送的功能
  9. SpringMVC Hello(IDEA)
  10. 不同编译单元内的非局部静态对象的初始化次序问题
  11. 手把手教你上手Proteus(下载安装+仿真51单片机程序)
  12. matlab 取整数命令,matlab取整函数命令代码
  13. 升级yosemite后java出错的解决
  14. 一键seo提交收录_百度网站提交,选择主动提交,还是被动收录?
  15. 软文标题怎么写吸引人?记住这几个套路
  16. MD5在线加密,带盐
  17. 适用于高速公路的查询软件,数据稳定、免维护,可查询高速路况、路线规划、未来天气等信息
  18. 51单片机驱动无源蜂鸣器
  19. (三)Window自带计算器实现换算、运算:快速科学计算、单位换算、二进制十六进制转换与运算、货币换算、长度换算等等
  20. 把套接字改成阻塞或非阻塞模式

热门文章

  1. DDD 为什么能火起来?和微服务有啥关系?
  2. 基于BlueZ的C语言蓝牙编程
  3. 第二章 学生指导(01 小学生身心发展的规律 02 学生心理发展与教育 03 小学生的学习)
  4. 读书笔记:《狼图腾》和《狼道》
  5. 09、查询详细信息和删除记录
  6. 51单片机 AT89C52 的中断/定时器/计时器 笔记
  7. 7-33 有理数加法 (15 分)C++
  8. 现货银价走势图分析技巧
  9. 七大实例巧解主板常见故障
  10. mldonkey设置!看图(转载)