[luogu3505][bzoj2088][POI2010]TEL-Teleportation【分层图】
题目大意
给出了一个图,然后让你加最多的边,让点\(1\)到\(2\)之间至少要经过5条边
解法
比较清楚,我们可以将这个图看作一个分层图,点\(1\)为第一层,再将\(2\)作为第五层,这样第一层和第五层直接加边就可以保证我们之间至少有\(5\)条边经过了。
那么剩下的点我们还是分成\(3\)层,其中第\(2\)层为与\(1\)直接相连的节点,第\(4\)层为直接和节点\(2\)相连的节点,剩下的节点我们就放在了第\(3\)层中,那么这样我们就做好了分层工作。
很明显最优的方案就是每一层的节点都两两相连,那么我们就先将所有的点都连起来,在减掉所有不可以的边。
什么边是不可以的呢?比如说是重复的边,或者是从点\(1\)连到到了\(2\)的边,这些边都是不可以的边。
那么我们每次只需要保证我们连接的边的两个端点是\(u,v\)是\(u<v\)就可以了。
若一个第三层的点连到某个第一层的点,则该点可以向第一层的所有点连边。若一个第三层的点连到某个第四层的点,则该点可以向所有第四层的点连边。否则的话就向节点数较多的那一层连边就好了。
ac代码(我丑陋的代码)
# include <cstdio>
# include <cstring>
# include <algorithm>
# include <ctype.h>
# include <iostream>
# include <cmath>
# include <map>
# include <vector>
# include <queue>
# define LL long long
# define ms(a,b) memset(a,b,sizeof(a))
# define ri (register int)
# define inf (0x7f7f7f7f)
# define pb push_back
# define fi first
# define se second
# define pii pair<int,int>
using namespace std;
inline int gi(){
int w=0,x=0;char ch=0;
while(!isdigit(ch)) w|=ch=='-',ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return w?-x:x;
}
# define N 1000005
struct edge{
int to,nt;
}E[N<<1];
int cnt,n,m,s1,s2;//s1表示第2层的点数,s2表示第4层点的个数
int H[N],link[N];
void addedge(int u,int v){//加边不说
E[++cnt]=(edge){v,H[u]}; H[u]=cnt;
}
int main(){
n=gi(),m=gi();
for (int i=1;i<=m;i++){
int u=gi(),v=gi();
addedge(u,v); addedge(v,u);
}
for (int e=H[1];e;e=E[e].nt) link[E[e].to]=1,s1++;//将所有与1相连的节点计算出来
for (int e=H[2];e;e=E[e].nt) link[E[e].to]=2,s2++;//累计所有和2相连的节点
int ans=0,s3=n-s1-s2-2,now1=s1,now2=s2;//now分别表示当前我们还有处理的与1和2相连的节点个数
for (int i=3;i<=n;i++){
if (link[i]==1){//如果当前节点和1相连
now1--,ans+=now1;//表示当前这个节点和其他和
for (int e=H[i];e;e=E[e].nt){
int v=E[e].to;
if (link[v]&&v>i) ans--;//减掉重复的边
}
}
if (link[i]==2){
now2--,ans+=now2;
for (int e=H[i];e;e=E[e].nt){
int v=E[e].to;
if (link[v]&&v>i) ans--;//减掉重复的边
}
}
if (!link[i]){
s3--; ans+=s3;
int fg=0,s=0;
for (int e=H[i];e;e=E[e].nt){
int v=E[e].to;
if (link[v]) fg=link[v],s++;
else if (v>i) ans--;
}
if (fg==1) ans+=s1-s;
else if (fg==2) ans+=s2-s;
else ans+=max(s1,s2);
}
}
printf("%d\n",ans);
return 0;
}
[luogu3505][bzoj2088][POI2010]TEL-Teleportation【分层图】的更多相关文章
- 【BZOJ-3627】路径规划 分层图 + Dijkstra + spfa
3627: [JLOI2014]路径规划 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 186 Solved: 70[Submit][Status] ...
- ACdream 1017 [分层图][网络流]
/* 大连热身C题 不要低头,不要放弃,不要气馁,不要慌张 题意: 给一个城市路线图,给定起点给定终点.有n个货物从起点运送到终点.城市的边是无向边. 每个货物每天如果通过某条路,那么这天这条路只能运 ...
- poj3635Full Tank?[分层图最短路]
Full Tank? Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7248 Accepted: 2338 Descri ...
- HDU 5669 线段树优化建图+分层图最短路
用线段树维护建图,即把用线段树把每个区间都标号了,Tree1中子节点有到达父节点的单向边,Tree2中父节点有到达子节点的单向边. 每次将源插入Tree1,汇插入Tree2,中间用临时节点相连.那么T ...
- BZOJ 2763 分层图最短路
突然发现我不会分层图最短路,写一发. 就是同层中用双向边相连,用单向边连下一层 #include <cstdio> #include <algorithm> #include ...
- ZOJ-2364 Data Transmission 分层图阻塞流 Dinic+贪心预流
题意:给定一个分层图,即只能够在相邻层次之间流动,给定了各个顶点的层次.要求输出一个阻塞流. 分析:该题直接Dinic求最大流TLE了,网上说采用Isap也TLE,而最大流中的最高标号预流推进(HLP ...
- 【网络流24题】 No.15 汽车加油行驶问题 (分层图最短路i)
[题意] 问题描述:给定一个 N*N 的方形网格,设其左上角为起点◎, 坐标为( 1, 1), X 轴向右为正, Y轴向下为正, 每个方格边长为 1, 如图所示. 一辆汽车从起点◎出发驶向右下角终点▲ ...
- 【网络流24题】 No.14 孤岛营救问题 (分层图最短路)
[题意] 1944 年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛, 营救被敌军俘虏的大兵瑞恩. 瑞恩被关押在一个迷宫里, 迷宫地形复杂, 但幸好麦克得到了迷宫的地形图. 迷宫的外形是 ...
- Bzoj 2834: 回家的路 dijkstra,堆优化,分层图,最短路
2834: 回家的路 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 62 Solved: 38[Submit][Status][Discuss] D ...
随机推荐
- [您有新的未分配科技点][BZOJ3545&BZOJ3551]克鲁斯卡尔重构树
这次我们来搞一个很新奇的知识点:克鲁斯卡尔重构树.它也是一种图,是克鲁斯卡尔算法求最小生成树的升级版首先看下面一个问题:BZOJ3545 Peaks. 在Bytemountains有N座山峰,每座山峰 ...
- GBDT和随机森林的区别
GBDT和随机森林的相同点: 1.都是由多棵树组成 2.最终的结果都是由多棵树一起决定 GBDT和随机森林的不同点: 1.组成随机森林的树可以是分类树,也可以是回归树:而GBDT只由回归树组成 2.组 ...
- 在Ubuntu18.04下将应用程序添加到启动器
# 在启动器里面给应用程序添加一个快捷方式 在linux(ubuntu)平台下,很多小伙伴发现,自己去官网下载解压的软件不能自动添加到启动器,每次启动的时候需要再次进入软件目录输入命令,非常不方便.本 ...
- Buy the Ticket HDU 1133
传送门 [http://acm.hdu.edu.cn/showproblem.php?pid=1133] 题目描述和分析 代码 #include<iostream> #include< ...
- 《蹭课神器》Beta版使用说明
相比 Alpha 版,我对主界面进行了优化,使主界面更加简洁 同时数据库增加了一个表,里面存放的是课程的详细信息
- 第三个Sprint ------第十天
上传到Github github 地址:https://github.com/be821/MyCat 百度云盘: 链接: http://pan.baidu.com/s/1hrxL6lu 密码: k9t ...
- 小学四则运算APP 第三阶段冲刺
<?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android=" ...
- 基础-Math.floor与parseInt区别
Math.floor只能对一个数向下取整,不能解析字符串 如: Math.floor(1.5) // 1 Math.floor(-2.1) // -3 Math.floor("3" ...
- [2017BUAA软工]个人项目:数独
一.项目地址 https://github.com/Slontia/Sudoku 附加作业(GUI):https://github.com/Slontia/SudokuGUI 二.开发时间 PSP2. ...
- Java WebMail
http://www.open-open.com/06.htm http://www.oracle.com/technetwork/java/javamail/third-party-136965.h ...