CSUST选拔赛题解之-Problem C: 先有durong后有天
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
Sample Input
5 4 1 2 2 3 3 4 4 5 1 3 2 3 5 2
Sample Output
0
HINT
#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后有天相关推荐
- CSUST选拔赛题解之-Problem H: 逃出监狱
Problem H: 逃出监狱 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 116 Solved: 42 [Submit][Status][Web ...
- CSUST选拔赛题解
---恢复内容开始--- A:哭泣的阿木木 题目链接:http://csustacm.com:4803/contest/26/problem/J 思路:这是一个很裸的线段树+lazy数组标记,直接用板 ...
- 北京信息科技大学第十三届程序设计竞赛暨ACM选拔赛题解
北京信息科技大学第十三届程序设计竞赛暨ACM选拔赛题解 A lzh的蹦床 B 所谓过河 C 旅行家问题1 D 旅行家问题2 E 小菲和Fib数列 F 好玩的音乐游戏 G ranko的手表 H 字母收集 ...
- XMU区域赛选拔赛题解
XMU区域赛选拔赛题解 B.是谁打了奶奶 Description 最近发生了一起骇人听闻的打奶奶事件,凶手就是--惊奇队长. 惊奇队长是在电车上打的奶奶,那么我们就来看一个和电车有关的问题. 某市修建 ...
- CSUST 集训队选拔赛题解
选拔赛的题解,~~~ 题目链接:请点击 A题 素数筛 + 线段树(树状数组) 先用素数筛打表,然后线段树更新,遍历求出值,O(1)查询即可 AC代码: /*num数组 是把记录 数是否存在 存在即为1 ...
- SWPU 2021年团队程序设计天梯赛选拔赛 题解
补题场链接:https://pintia.cn/problem-sets/1373141720280027136 本次选拔赛除后三题以外,其余的题目难度都不是很大,简单筛选一下大家的基础.请大家这段时 ...
- 2018 焦作站亚洲区域赛校内选拔赛题解
SUST_2018 焦作站亚洲区域赛校内选拔赛 A.高速 by yoyo tag:图论.最短路 //最短路 #include<bits/stdc++.h> using nam ...
- 2018中国大学生程序设计竞赛-网络选拔赛题解
以下所有AC题解程序来自"仙客传奇"团队. A. Buy and Resell AC的C++语言程序: #include<iostream> #include<c ...
- SUST_2018 焦作站亚洲区域赛校内选拔赛题解
SUST_2018 焦作站亚洲区域赛校内选拔赛 A.高速 by yoyo tag:图论.最短路 //最短路 #include<bits/stdc++.h> using nam ...
最新文章
- OpenCV+python:图像二值化
- Weblogic项目部署教程
- xampp配置xdebug
- C# 判断一字符串是否为合法数字(正则表达式)
- React之初始化state
- Java讲课笔记17:Lambda表达式
- Linux内核TCP/IP协议栈运行时序 | 配图
- php推送系统,php 如何加入即时推送的功能
- SpringMVC Hello(IDEA)
- 不同编译单元内的非局部静态对象的初始化次序问题
- 手把手教你上手Proteus(下载安装+仿真51单片机程序)
- matlab 取整数命令,matlab取整函数命令代码
- 升级yosemite后java出错的解决
- 一键seo提交收录_百度网站提交,选择主动提交,还是被动收录?
- 软文标题怎么写吸引人?记住这几个套路
- MD5在线加密,带盐
- 适用于高速公路的查询软件,数据稳定、免维护,可查询高速路况、路线规划、未来天气等信息
- 51单片机驱动无源蜂鸣器
- (三)Window自带计算器实现换算、运算:快速科学计算、单位换算、二进制十六进制转换与运算、货币换算、长度换算等等
- 把套接字改成阻塞或非阻塞模式