蓝桥杯—网络寻路题解(邻接表构图)

来源:互联网 发布:篮球教学软件大全 编辑:程序博客网 时间:2024/04/27 18:04

问题描述

X 国的一个网络使用若干条线路连接若干个节点。节点间的通信是双向的。某重要数据包,为了安全起见,必须恰好被转发两次到达目的地。该包可能在任意一个节点产生,我们需要知道该网络中一共有多少种不同的转发路径。

源地址和目标地址可以相同,但中间节点必须不同。

如下图所示的网络。


1 -> 2 -> 3 -> 1 是允许的

1 -> 2 -> 1 -> 2 或者 1 -> 2 -> 3 ->2都是非法的。

输入格式

输入数据的第一行为两个整数N M,分别表示节点个数和连接线路的条数(1<=N<=10000; 0<=M<=100000)。

接下去有M行,每行为两个整数 u 和 v,表示节点u 和 v 联通(1<=u,v<=N , u!=v)。

输入数据保证任意两点最多只有一条边连接,并且没有自己连自己的边,即不存在重边和自环。

输出格式

输出一个整数,表示满足要求的路径条数。

样例输入1

3 3
1 2
2 3
1 3

样例输出1

6

样例输入2

4 4
1 2
2 3
3 1
1 4

样例输出2

10

 

分析:分别以所有结点为起点,进行DFS,搜索一个第一结点,一个第二结点,一个终点。其中第二结点和起点不能相同,终点和第一结点不能相同。这里用邻接表构图比较简单。利用STL的vector容器构造链表。需要一个vector的数组,一共需要N条链表,数组下标为起点。

 

AC代码:

#include<iostream>

#include<vector>

using namespace std;

 

int N,M;  //结点数  边数

vector<int> u[10001];   //邻接表

 

int main()

{

       cin>>N>>M;

       for(inti=1;i<=M;++i)           //构造邻接表数组数组的下标为起点

       {

              ints,e;

              cin>>s>>e;

              u[s].push_back(e);

              u[e].push_back(s);

       }

       intcnt=0;

       for(intstart=1;start<=N;++start)         //搜索所有起点

       {

              for(inti=0;i<u[start].size();++i)           

              {

                     intfirst=u[start][i];         //第一个结点

                     for(intj=0;j<u[first].size();++j)

                     {

                            if(u[first][j]==start) //第二个结点不能为起点

                                   continue;

                            intsecond=u[first][j];    //第二结点

                            for(intk=0;k<u[second].size();++k)     //搜索终点

                            {

                                   if(u[second][k]==first)          //终点不能为第一结点

                                          continue;

                                   cnt++;

                            }

                     }

              }

       }

       cout<<cnt<<endl;

       return0;

}

0 0
原创粉丝点击