linux内核中驱动开发常见的类似多态

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

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

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;
}

linux内核中驱动开发常见的类似多态

时间: 2024-10-16 00:13:06

linux内核中驱动开发常见的类似多态的相关文章

linux内核中驱动开发常见的相似多态

#include<stdio.h> #include<stdlib.h> struct test { char name[20]; void (*func)(char *); }; void tttfunc(char *name) { printf("current is %d\n",__LINE__); printf("%s\n",name); } int main() { struct test ttt= { .name = "

Linux内核中常见内存分配函数zz

https://blog.csdn.net/wzhwho/article/details/4996510 1.      原理说明 Linux内核中采用了一种同时适用于32位和64位系统的内存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系统中,用到了四级页表,如图2-1所示.四级页表分别为: l         页全局目录(Page Global Directory) l         页上级目录(Page Upper Directory) l         页中间目录(

从Linux内核LED驱动来理解字符设备驱动开发流程

目录 博客说明 开发环境 1. Linux字符设备驱动的组成 1.1 字符设备驱动模块加载与卸载函数 1.2 字符设备驱动的file_operations 结构体中的成员函数 2. 字符设备驱动--设备号注册卸载 2.1 设备号注册 2.2 设备号注销 3. 字符设备驱动--文件操作 参考资料 示例代码 @(从Linux内核LED驱动来理解字符设备驱动开发流程) 博客说明 撰写日期 2018.12.08 完稿日期 2019.10.06 最近维护 暂无 本文作者 multimicro 联系方式 [

Linux内核中常见内存分配函数

1.原理说明 Linux内核中采用了一种同时适用于32位和64位系统的内存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系统中,用到了四级页表,如图2-1所示.四级页表分别为: l   页全局目录(Page Global Directory) l   页上级目录(Page Upper Directory) l   页中间目录(Page Middle Directory) l   页表(Page Table) 页全局目录包含若干页上级目录的地址,页上级目录又依次包含若干页中间目录

Linux 下wifi 驱动开发(三)—— SDIO接口WiFi驱动浅析

SDIO-Wifi模块是基于SDIO接口的符合wifi无线网络标准的嵌入式模块,内置无线网络协议IEEE802.11协议栈以及TCP/IP协议栈.可以实现用户主平台数据通过SDIO口到无线网络之间的转换.SDIO具有数据传输快,兼容SD.MMC接口等特点. 对于SDIO接口的wifi,首先,它是一个sdio的卡的设备.然后具备了wifi的功能.所以.注冊的时候还是先以sdio的卡的设备去注冊的. 然后检測到卡之后就要驱动他的wifi功能了.显然,他是用sdio的协议,通过发命令和数据来控制的.以

Linux下spi驱动开发

转载至:http://www.embedu.org/Column/Column367.htm 作者:刘洪涛,华清远见嵌入式学院讲师. 一.概述 基于子系统去开发驱动程序已经是linux内核中普遍的做法了.前面写过基于I2C子系 统的驱动开发.本文介绍另外一种常用总线SPI的开发方法.SPI子系统的开发和I2C有很多的相似性,大家可以对比学习.本主题分为两个部分叙述,第一 部分介绍基于SPI子系统开发的理论框架:第二部分以华清远见教学平台FS_S5PC100上的M25P10芯片为例(内核版本2.6

【总结】嵌入式linux内核中Makefile、Kconfig、.config的关系及增加开机Hello World【转】

本文转载自:http://blog.csdn.net/fengyuwuzu0519/article/details/73772109 为了弄清内核的组织结构,我们先来实现下面这个简单的例子. 一.增加内核启动Hello World 任务: 内核启动的时候加载Hello驱动,并打印出Hello World 步骤: (1)在drivers目录下新建hello文件夹,在里面实现相应的hello.c.Makefile.Kconfig (2)修改上一级(Linux-3.4.2/drivers下)的Make

[转] Linux 内核中的 Device Mapper 机制

本文结合具体代码对 Linux 内核中的 device mapper 映射机制进行了介绍.Device mapper 是 Linux 2.6 内核中提供的一种从逻辑设备到物理设备的映射框架机制,在该机制下,用户可以很方便的根据自己的需要制定实现存储资源的管理策略,当前比较流行的 Linux 下的逻辑卷管理器如 LVM2(Linux Volume Manager 2 version).EVMS(Enterprise Volume Management System).dmraid(Device M

向linux内核中添加外部中断驱动模块

本文主要介绍外部中断驱动模块的编写,包括:1.linux模块的框架及混杂设备的注册.卸载.操作函数集.2.中断的申请及释放.3.等待队列的使用.4.工作队列的使用.5.定时器的使用.6.向linux内核中添加外部中断驱动模块.7.完整驱动程序代码.linux的内核版本为linux2.6.32.2. 一.linux模块的框架以及混杂设备相关知识 1.内核模块的框架如下图所示,其中module_init()(图中有误,不是modules_init)只有在使用insmod命令手动加载模块时才会被调用,