题目大意

给出了一个图,然后让你加最多的边,让点\(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【分层图】的更多相关文章

  1. 【BZOJ-3627】路径规划 分层图 + Dijkstra + spfa

    3627: [JLOI2014]路径规划 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 186  Solved: 70[Submit][Status] ...

  2. ACdream 1017 [分层图][网络流]

    /* 大连热身C题 不要低头,不要放弃,不要气馁,不要慌张 题意: 给一个城市路线图,给定起点给定终点.有n个货物从起点运送到终点.城市的边是无向边. 每个货物每天如果通过某条路,那么这天这条路只能运 ...

  3. poj3635Full Tank?[分层图最短路]

    Full Tank? Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7248   Accepted: 2338 Descri ...

  4. HDU 5669 线段树优化建图+分层图最短路

    用线段树维护建图,即把用线段树把每个区间都标号了,Tree1中子节点有到达父节点的单向边,Tree2中父节点有到达子节点的单向边. 每次将源插入Tree1,汇插入Tree2,中间用临时节点相连.那么T ...

  5. BZOJ 2763 分层图最短路

    突然发现我不会分层图最短路,写一发. 就是同层中用双向边相连,用单向边连下一层 #include <cstdio> #include <algorithm> #include ...

  6. ZOJ-2364 Data Transmission 分层图阻塞流 Dinic+贪心预流

    题意:给定一个分层图,即只能够在相邻层次之间流动,给定了各个顶点的层次.要求输出一个阻塞流. 分析:该题直接Dinic求最大流TLE了,网上说采用Isap也TLE,而最大流中的最高标号预流推进(HLP ...

  7. 【网络流24题】 No.15 汽车加油行驶问题 (分层图最短路i)

    [题意] 问题描述:给定一个 N*N 的方形网格,设其左上角为起点◎, 坐标为( 1, 1), X 轴向右为正, Y轴向下为正, 每个方格边长为 1, 如图所示. 一辆汽车从起点◎出发驶向右下角终点▲ ...

  8. 【网络流24题】 No.14 孤岛营救问题 (分层图最短路)

    [题意] 1944 年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛, 营救被敌军俘虏的大兵瑞恩. 瑞恩被关押在一个迷宫里, 迷宫地形复杂, 但幸好麦克得到了迷宫的地形图. 迷宫的外形是 ...

  9. Bzoj 2834: 回家的路 dijkstra,堆优化,分层图,最短路

    2834: 回家的路 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 62  Solved: 38[Submit][Status][Discuss] D ...

随机推荐

  1. 使用TensorFlow的递归神经网络(LSTM)进行序列预测

    本篇文章介绍使用TensorFlow的递归神经网络(LSTM)进行序列预测.作者在网上找到的使用LSTM模型的案例都是解决自然语言处理的问题,而没有一个是来预测连续值的. 所以呢,这里是基于历史观察数 ...

  2. [数据可视化之一]Pandas单变量画图

    Pandas单变量画图 Bar Chat Line Chart Area Chart Histogram df.plot.bar() df.plot.line() df.plot.area() df. ...

  3. Java HTML to PDF 支持SVG

    尝试一 (现用框架的基础上改动,影响最小化) 最早使用的框架 Xhtmlrenderer,需要把HTML转换成XHTML,引入第二个框架Tidy,Tidy与2010年停止更新,github上的项目也停 ...

  4. 【亲测有效】Kali Linux无法安装网易云音乐的解决方案

    问题描述 由于 Kali Linux 的内核是基于 Debian 的,我们在安装网易云音乐的时候更偏向于选择安装网易云音乐 v1.1.0 deepin15(64位) 的包,可是我发现在安装过程中,无法 ...

  5. Maven 项目生成或者update jdk变为1.5的问题

    在使用Maven构建项目时,生成的maven项目jdk默认使用的是jdk1.5. 在手动修改了jdk之后,update project之后jdk又会变为1.5. 或者用eclipse的Maven插件生 ...

  6. hdu 3038 给区间和,算出多少是错的

    参考博客 How Many Answers Are Wrong Problem Description TT and FF are ... friends. Uh... very very good ...

  7. 个人博客作业Week7(阅读文章,心得体会)

    Alpha阶段结束了,内心可以说是五味杂陈.不是说我们的产品拿不上台面那般差劲,复杂的心绪主要来源于和别的队的比较,别的队才刚刚发布没多久访问量和注册量就破百了,并且还发起了找bug送红包的活动.可能 ...

  8. java计算器项目

    简单的java计算器项目   题目:java计算器项目 一. 题目简介: 一个能进行加减乘除四则运算的小程序 Github链接:https://github.com/lizhenbin/test/tr ...

  9. Leetcode——171.宝石与石头

    水题: 给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头. S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石. J 中的字母不重复,J 和 S中的所有字符 ...

  10. PAT L2-002 链表去重

    https://pintia.cn/problem-sets/994805046380707840/problems/994805072641245184 给定一个带整数键值的链表 L,你需要把其中绝 ...