LR杂记 - Linux系统监控工具之vmstat详解

题意:求一个无向图的,去掉两个不同的点后最多有几个连通分量。

思路:枚举每个点,假设去掉该点,然后对图求割点后连通分量数,更新最大的即可。算法相对简单,但是注意几个细节:

1:原图可能不连通。

2:有的连通分量只有一个点,当舍去该点时候,连通分量-1;

复习求割点的好题!

#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
int n,m;
vector<vector<int> >e(10010);
int dfn[5010];int low[5010];int vis[5010];
int times=0;
int subset[5010];
int root=0;
int rf=0;
int son=0;
void tarjan(int u,int fa)     //无向图tarjan记录父亲
{
    if(u==rf)return;          //是被枚举的点,舍去(从图中删去)。
    dfn[u]=low[u]=times++;
    for(int i=0;i<e[u].size();i++)
    {
        int v=e[u][i];
        if(v==rf)continue;     // 这里注意,舍去的点不要了
        if(!vis[v])
        {
            vis[v]=1;
            tarjan(v,u);
            if(low[v]<low[u])low[u]=low[v];
            if(u==root)                   //求割点是根的情况
              {
                  son++;
              }
            else                  // 其他情况
            {
                if(dfn[u]<=low[v])    //subset【u】+1记录 以u为割点后形成的连通分量数
                    subset[u]++;
            }

        }
        else if(v!=fa)         //条件注意
        {
            if(dfn[v]<low[u])low[u]=dfn[v];
        }
    }
    return ;
}
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        for(int i=0;i<=n;i++)
           {
             dfn[i]=low[i]=subset[i]=vis[i]=0;
             e[i].clear();
           }
        int ta,tb;
      for(int i=0;i<m;i++)
      {
          scanf("%d%d",&ta,&tb);
           e[ta].push_back(tb);
           e[tb].push_back(ta);
      }
      int maxx=0;
      for(int i=0;i<n;i++)   //枚举每个点
      {
          rf=i;               //i舍去
          vis[rf]=1;
          int scc=0;
          int maxson=0;
          for(int iii=0;iii<n;iii++)          //考虑原图不连通!
             {
                 if(!vis[iii])
                 {
                     vis[iii]=1;
                     root=iii;
                     tarjan(iii,-1);
                     scc++;                     //连通分量数
                     if(son>maxson)maxson=son;    //求出每个连通分量的根的最大的son
                     son=0;                         //每个连通分量要更新son
                 }
             }
            if(e[i].size()==0)scc--;    // 注意点!!!:该连通分量只有一个点!舍去的话就没了。
          for(int ii=0;ii<n;ii++)             //取最大的
          {
              if(scc+subset[ii]+1-1>maxx)maxx=scc+subset[ii]+1-1;
          }
          if(scc+maxson-1>maxx)maxx=maxson+scc-1;
          for(int j=0;j<n;j++)    //不忘更新!
          {
              dfn[j]=low[j]=subset[j]=vis[j]=0;
          }
          son=times=0;
      }
      cout<<maxx<<endl;
    }
    return 0;
}

LR杂记 - Linux系统监控工具之vmstat详解

时间: 2024-07-31 14:45:16

LR杂记 - Linux系统监控工具之vmstat详解的相关文章

linux系统监控工具之top详解

基础视图 第一行: 09:57:34 系统当前运行时间 up 23 days,23:33  系统自上次开机运行的时间. 1 user  当前登录用户 load average: 0.32, 0.24, 0.15 系统平均负载,即任务队列的长度.分别是1分钟.5分钟.15分钟 第二行: 245 total 进程总数 1 running 1个运行进程 244 sleeping 239个休眠进程 0 stopped 0个停止进程 0 zombie  0个僵尸进程 第三行: 3.1% us   用户空间

Ubuntu Linux系统下apt-get命令详解

Ubuntu Linux系统下apt-get命令详解(via|via) 常用的APT命令参数: apt-cache search package 搜索包 apt-cache show package 获取包的相关信息,如说明.大小.版本等 sudo apt-get install package 安装包 sudo apt-get install package - - reinstall 重新安装包 sudo apt-get -f install 修复安装"-f = ——fix-missing&

Linux 系统下 ifconfig 命令详解

Linux系统下网卡网络配置详解 Ifconfig命令使LINUX核心知道软件回送和网卡这样一些网络接口,这样Linux就可以使用它们. 除了上面介绍的这些用法之外,ifconfig命令用来监控和改变网络接口的状态,并且还可以带上很多命令行参数.下面是一个ifconfig的通用调用语法: #ifconfig interface [[-net -host] address [parameters]] 其中interface是网络接口名:address是分配给指定接口的主机名或IP地址.这里使用的主

3、【Linux系统编程】系统目录详解

Linux系统目录详解 一.Linux系统目录结构 1.根目录/ 这就是根目录.对你的电脑来说,有且只有一个根目录.所有的东西,我是说所有的东西都是从这里开始.举个例子:当你在终端里输入"/home",你其实是在告诉电脑,先从/(根目录)开始,再进入到home目录. 2./root 这是系统管理员(root user)的目录.对于系统来说,系统管理员就好比是上帝,它能对系统做任何事情,甚至包括删除你的文件.因此,请小心使用root帐号. 3./bin  /usr/bin  /usr/l

linux系统下文件命令详解

/etc 目录下包含的用户信息文件有: 3.1.0 passwd: 用户库文件 用户名 UID,GID 和工作目录都在此文件中 Shadow:存放用户口令的文件,每个用户的 口令加密后都放在此文件中 Group :主要存储用户组信息 Fstab: 系统开机启动自动挂载分区列表,需要设置开机自动挂载的分区都可以在此文件中加入. Inittab: 这个命令的配置文件,此文件是linux启动的重要文件,用来完成对整个系统的基本初始化配置 Hosts: 设定用户自己的ip与名字的对应表,类似window

Linux系统的top命令详解

top默认视图 代码如下: 第一行:top - 15:32:23 up 738 days,  3:43,  5 users,  load average: 0.06, 0.08, 0.0815:29:50 - 当前系统时间 738 days,  3:41 - 系统已经运行了738天3小时14分钟(在这期间没有重启过)5 users - 当前有5个用户登录系统load average: 0.06, 0.09, 0.08 - load average后面的三个数分别是1分钟.5分钟.15分钟的负载情

Linux 系统之正则表达式----grep 详解

一.正则表达式的起源: 正则表达式的"祖先"可以一直上溯至对人类神经系统如何工作的早期研究.Warren McCulloch 和 Walter Pitts 这两位神经生理学家研究出一种数学方式来描述这些神经网络. 1956 年, 一位叫 Stephen Kleene 的美国数学家在 McCulloch 和 Pitts 早期工作的基础上,发表了一篇标题为"神经网事件的表示法"的论文,引入了正则表达式的概念.正则表达式就是用来描述他称为"正则集的代数"

Linux系统常用命令nl详解

nl命令在linux系统中用来计算文件中行号.nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样,nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等等的功能.本文和大家分享的主要是linux中nl命令的相关用法,希望对大家学习linux有所帮助. 1.命令格式: nl [选项]- [文件]- 2.命令参数: -b :指定行号指定的方式,主要有两种: -b a :表示不论是否为空行,也同样列出行号(类似 cat -n): -b t :如果有空行,空

Linux系统挂载操作mount详解

在Linux系统中,文件系统不挂载是无法使用的.挂载,即是让文件系统在操作系统中可用.在Linux中使用mount命令来挂载文件系统,有永久性挂载和临时性挂载两种挂载方式. 1. 永久性挂载: 修改配置文件/etc/fstab,将需要挂载的文件系统写入这个配置文件中,再使用命令 mount -a 让配置信息生效,挂载的文件即可使用. 下图为配置文件/etc/fstab的内容,圈出来的一行便是我们需要加上去的信息. 挂载后,可使用mount查看相关信息,使用命令df -h 查看可用分区. 2. 临