历届试题 网络寻路

来源:互联网 发布:数据分析师 泉州 编辑:程序博客网 时间:2024/05/22 04:30

问题描述
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

#include <stdio.h>#include <vector>#include <string.h>using namespace std;int bj[12345];vector <int> v[12345];void dfs(int k,int num,int &ans,int q){    if(num==2)    {        for(int i=0;i<v[k].size();i++)        {            if(!bj[v[k][i]] || v[k][i]==q)            {                ans++;            }        }        return;    }    for(int i=0;i<v[k].size();i++)    {        if(!bj[v[k][i]])        {            bj[v[k][i]]=1;            dfs(v[k][i],num+1,ans,q);            bj[v[k][i]]=0;        }    }}int main(){    int n,m;    scanf("%d %d",&n,&m);    for(int i=0;i<m;i++)    {        int u,k;        scanf("%d %d",&u,&k);        v[u].push_back(k);        v[k].push_back(u);    }    int foo=0;    for(int i=1;i<=n;i++)    {        memset(bj,0,sizeof(bj));        bj[i]=1;        dfs(i,0,foo,i);    }    printf("%d\n",foo);    return 0;}
0 0
原创粉丝点击