网易有道笔试:求连通图的割点(关节点)

题目:求一个连通图的割点,割点的定义是,如果除去此节点和与其相关的边,图不再连通,描述算法。

分析:

1. 最简单也是最直接的算法是,删除一个点然后判断连通性,如果删除此点,图不再连通,则此点是割点,反之不是割点(图的连通性一般通过深搜来判定,是否能一次搜索完 全部顶点);

2. 通过深搜优先生成树来判定。从任一点出发深度优先遍历得到优先生成树,对于树中任一顶点V而言,其孩子节点为邻接点。由深度优先生成树可得出两类割点的特性:

     (1)若生成树的根有两棵或两棵以上的子树,则此根顶点必为割点。因为图中不存在连接不同子树顶点的边,若删除此节点,则树便成为森林;

     (2)若生成树中某个非叶子顶点V,其某棵子树的根和子树中的其他节点均没有指向V的祖先的回边,则V为割点。因为删去v,则其子树和图的其它部分被分割开来。

仍然利用深搜算法,只不过在这里定义visited[v]表示为深度优先搜索遍历图时访问顶点v的次序号,定义low[v]=Min{visited[v],low[w],visited[k]},其中w是顶点v在深度优先生成树上的孩子节点;k是顶点v在深度优先生成树上由回边联结的祖先节点。

   割点判定条件:如果对于某个顶点v,存在孩子节点w且low[w]>=visited[v],则该顶点v必为关节点。因为当w是v的孩子节点时,low[w]>=visited[v],表明w及其子孙均无指向v的祖先的回边,那么当删除顶点v后,v的孩子节点将于其他节点被分割开来,从来形成新的连通分量。

#include <iostream>
#include <string>
using namespace std;

#define MAX_VERTEX_NUM 13

//邻接表存储结构
typedef struct ArcNode{
    int adjvex;
    ArcNode *nextarc;
}ArcNode;

typedef struct VNode{
    string data;
    ArcNode* firstarc;
}VNode,AdjList[MAX_VERTEX_NUM];

typedef struct{
    AdjList vertices;
    int vexnum, arcnum;
}ALGraph;

//返回u在图中的位置
int LocateVex(ALGraph G, string u)
{
    for(int i=0; i<G.vexnum; i++)
        if(G.vertices[i].data==u)
            return i;
    return -1;
}

//构造图
void CreateDG(ALGraph &G)
{
    string v1, v2;
    int i, j, k;
    cout<<"请输入顶点数和边数:";
    cin>>G.vexnum>>G.arcnum;

    cout<<"请输入顶点:";
    for(i=0; i<G.vexnum; i++)
    {
        cin>>G.vertices[i].data;
        G.vertices[i].firstarc=NULL;
    }

    cout<<"请输入边:"<<endl;
    for(k=0; k<G.arcnum; k++)
    {
        cin>>v1>>v2;
        i=LocateVex(G, v1);
        j=LocateVex(G, v2);

        //无向图
        ArcNode *arc=new ArcNode;
        arc->adjvex=j;
        arc->nextarc=G.vertices[i].firstarc;
        G.vertices[i].firstarc=arc;

        arc=new ArcNode;
        arc->adjvex=i;
        arc->nextarc=G.vertices[j].firstarc;
        G.vertices[j].firstarc=arc;
    }

}

//求割点
int count ;
int visited[MAX_VERTEX_NUM];
int low[MAX_VERTEX_NUM];

//从第v0个顶点出发深搜,查找并输出关节点(割点)
void DFSArticul(ALGraph G, int v0)
{
    int min, w;
    ArcNode *p;
    visited[v0]=min=++count;//v0是第count个访问的顶点,min的初值为visited[v0],即v0的访问次序

    for(p=G.vertices[v0].firstarc; p ; p=p->nextarc)
    {
        w=p->adjvex;
        if(visited[w]==0)//w未曾访问,是v0的孩子
        {
            DFSArticul(G, w);//从第w个顶点出发深搜,查找并输出关节点(割点),返回前求得low[w]
            if(low[w]<min)//如果v0的孩子节点w的low[]小,说明孩子节点还与其他节点(祖先)相邻
                min=low[w];
            if(low[w]>=visited[v0])//v0的孩子节点w只与v0相连,则v0是关节点(割点)
                cout<<G.vertices[v0].data<<" ";
        }
        else if(visited[w]<min)//w已访问,则w是v0生成树上祖先,它的访问顺序必小于min
            min=visited[w];
    }

    low[v0]=min;//low[v0]取三者最小值

}

void FindArticul(ALGraph G)
{
    int i, v;
    ArcNode *p;
    count=1;
    visited[0]=1;//从0号节点开始
    for(i=1; i<G.vexnum; i++)
        visited[i]=0;
    p=G.vertices[0].firstarc;
    v=p->adjvex;
    DFSArticul(G, v);
    if(count<G.vexnum)
    {
        cout<<G.vertices[0].data<<" ";
        while(p->nextarc)
        {
            p=p->nextarc;
            v=p->adjvex;
            if(visited[v]==0)
                DFSArticul(G, v);
        }
    }
}

void main()
{
    ALGraph g;
    CreateDG(g);

    cout<<"割点如下: "<<endl;
    FindArticul(g);
    cout<<endl;
}

 

时间: 2024-07-29 03:55:34

网易有道笔试:求连通图的割点(关节点)的相关文章

网易有道提前布局 应对传统搜索引擎面临的挑战

中介交易 SEO诊断 淘宝客 云主机 技术大厅 "目前,传统搜索引擎正面临着来自即时搜索.社区.地理位置信息等多方面的挑战."2010年12月14日,华扬联众广告公司CEO苏同在2010网络搜索营销年会上如此表示. 日益膨胀的网络信息以及社交网络的扁平化发展对搜索引擎提出了更高的要求."搜索引擎的未来才刚刚开始,对于中国搜索引擎市场来说,社会化的搜索将是未来搜索引擎重要的发展方向." 网易高级副总裁周枫在年会现场表示,"随着搜索引擎发展方式的转变,搜索引擎

网易有道正式推出地图搜索服务

中介交易 SEO诊断 淘宝客 云主机 技术大厅 8月28日消息,有道搜索已于近日悄然上线地图搜索服务,这是继在线翻译.音乐搜索后的又一产品发布. 据网易有道市场总监胡琛透露,本次发布的有道地图搜索与对手相比更多是在细节和用户体验上有所变化,之所以推出地图搜索服务,是为了补全产品线并满足用户需要.他表示,从7月到现在,有道先后推出了音乐.机器翻译.地图等服务,单独来看,一个产品的意义并不算太大,但是把这些产品结合起来,就可以凸显出有道搜索的优势.有道地图搜索与百度(企业库 论坛)有所不同的是,地图

网易有道上线有道云协作 整合笔记和即时通讯功能

DoNews 11月4日消息 11月4日,网易有道企业级应用有道云协作正式上线,目前已经覆盖PC.MAC.Web.iphone以及Android多个终端和平台. 据悉,该应用主要具备团队资料管理和团队即时通讯两大功能,其中团队资料管理兼容各大主流文档格式,用户可通过云协作实现团队资料上传.下载.搜索.协同编辑以及协同表格管理和版本管理等功能.即时通讯则让支持用户通过不同终端实现团队沟通.对团队资料进行编辑和讨论.而这两大功能均通过"群"的概念来组织和实现. 网易高级副总裁周枫表示,有道

网易有道终于低头认输,停止搜索技术研发

日前,网易有道在官方博客宣布与360达成战略合作,今后网页.新闻.图片.视频等方面的搜索结果将由360搜索提供,而将冻结"Web搜索产品的研发与维护",不再进行搜索相关核心技术的研发. 这意味着有道搜索宣告失败,虽然网易想要自圆其说,其高级副总裁.有道CEO周枫把此举称为"有道向移动互联网业务的彻底转型",但事实上,这其实意味着从2006年就开始的网易通用搜索正式宣告失败,继早夭的新浪爱问之后,有道成为又一个门户搜索大战时代的牺牲品. 这个大战可以追溯到2004年,

网易有道回应“饭饭”抄袭事件

和讯科技消息 4月26日,针对大众点评网就网易"饭饭"抄袭事件,网易有道公司今日发表声明称,大众点评网近期的一系列行为,并不是从互联网用户的利益出发,并表示网易反对任何恶意炒作的行为. 网易有道公司还表示,饭饭提供餐馆名称.地址.基本服务信息都是作为公开的社会公共服务信息,网易有道有权结合自身产品特色加工使用,而不应由大众点评网排他性使用. 网易有道公司认为,饭饭完全从用户的喜好和真实评分出发,利用个性化推荐引擎,为用户提供个性化的餐馆推荐服务. 网易有道公司就此声明全文: 1.&qu

由网易有道举办的2012“有道难题”创新大赛

和讯科技消息 6月3日,由网易有道举办的2012"有道难题"创新大赛的开放日活动在京举行,有道难题数据显示,截止目前,已经有超过3000支团队报名参加本届创新大赛,报名学生团队来自清华大学.北京大学.复旦大学.南京大学.中山大学等全国41所重点高校.本次大赛共为参赛者提供了总价值高达60万的奖金和奖品,冠军奖金更是高达10万元. 网易公司高级副总裁周枫在"有道难题"开放日致辞中表示:"移动客户端是未来互联网发展的趋势.网易在移动领域无论从技术.实践方面都处

360搜索“拉拢”网易有道 搜索业整合加速

与搜狗的关系尚未尘埃落定,360已和网易结盟,开始了合纵连横的序幕. 近日,网易有道表示,将与360达成战略合作,360将为网易有道搜索提供技术支持服务,服务包括网页.新闻.图片.视频等多个搜索产品.但网易有道搜索广告收入,以及旗下移动互联网产品不受影响. 尽管网易高级副总裁.网易有道CEO周枫将这一合作称作"有道向移动 互联网业务的彻底转型",但这也意味着从2006年开始进军通用搜索的网易宣告对搜索业务的战略性放弃. 搜索格局已定? 网易有道凭借搜索产品起家,网易CEO丁磊曾扬言希望

国内PC搜索引擎市场洗牌加剧:网易有道出局

网易有道上周五发布公开信,称与360达成战略合作,从当日开始360搜索为网易有道搜索提供技术支持服务,搜索结果将由360搜索提供.以后使用有道搜索时,页面右上方会出现 "以下搜索结果由 360 搜索提供"的提示.这意味着网易正式放弃通用搜索领域争夺. 网易是通用搜索市场老兵,2006年就涉足这一领域,不过,近年来淡化对通用搜索领域的争夺.据腾讯科技了解,两年前网易有道负责通用搜索的团队有100多人,不过,一年前人人公司挖走有道搜索商业团队,此后网易对通用搜索投入持续减少,到今年初仅2人

网易有道放弃做搜索?冻结Web搜索产品研发与维护

硅谷网讯 8月2日消息,网易有道今日发布公开信,称公司已与360达成战略合作,从今天开始360搜索为有道搜索提供技术支持服务,搜索结果将由360搜索提供. 现在使用有道搜索时,页面右上方会出现 "以下搜索结果由 360 搜索提供"的提示. 网易有道还指出,为集中资源在移动互联网上抢占先机,经过慎重思考,决定将Web搜索产品的研发与维护冻结. 另据360官方消息,未来360搜索将会作为技术支持方给有道搜索提供搜索结果.特型搜索结果展示等服务,双方本次合作将包含网页.新闻.图片.视频等多个