当前位置: 首页 > news >正文

历届试题 网络寻路

问题描述

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加剪枝。依次从每个节点出发,找到一个长度为四的路径,可以为环,保证第一个节点不可以和第二个第三个节点相同,第四个节点不可以和第三个节点的和第二个节点相同
代码1如下:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int Amap[5001][5001];
 4 int array[4];
 5 int start;
 6 int end;
 7 int sum=0;
 8 int t=1;
 9 int N,M;
10 void dfs(int n)
11 {
12     if(t==3){
13      for(int i=1;i<=N;i++){
14         if(Amap[n][i]==1){
15             sum++;
16         }
17      }
18         sum--;
19         }else{
20             for(int i=1;i<=N;i++){
21             if(Amap[n][i]==1){
22                  array[t]=i;
23                  if(t==1){
24                      t++;
25                     dfs(i);
26                     t--;
27                  }
28                if(t==2){
29                     t++;
30                     if(array[0]!=array[2]){
31                         dfs(i);
32                     }
33                     t--;
34                }
35 
36             }
37           }
38     }
39 }
40 int main()
41 {
42      memset(Amap,0,sizeof(Amap));
43      memset(array,0,sizeof(array));
44 
45      cin >> N>> M;
46      for(int i=0;i<M;i++){
47         cin >> start >> end;
48         Amap[start][end]=Amap[end][start]=1;
49      }
50      for(int i=1;i<=N;i++){
51             array[0]=i;
52         dfs(i);
53      }
54      cout << sum;
55     return 0;
56 }

由于第五组测试数据过大,数组不可以分那么多的空间,考虑使用vector代码如下:

代码2:

 
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 vector<int> Amap[10010];
 4 int array[4];
 5 int start;
 6 int end;
 7 int sum=0;
 8 int t=1;
 9 int N,M;
10 void dfs(int n)
11 {
12     if(t==3){
13      for(vector<int>::iterator iter=Amap[n].begin();iter<Amap[n].end();iter++){
14             sum++;
15      }
16         sum--;
17         }else{
18             for(vector<int>::iterator iter=Amap[n].begin();iter<Amap[n].end();iter++){
19                 array[t]=*iter;
20                 if(t==1){
21                     t++;
22                     dfs(*iter);
23                     t--;
24                 }
25                 if(t==2){
26                     t++;
27                     if(array[0]!=array[2]){
28                         dfs(*iter);
29                     }
30                     t--;
31                }
32 
33             }
34     }
35 }
36 int main()
37 {
38      memset(Amap,0,sizeof(Amap));
39      memset(array,0,sizeof(array));
40 
41      cin >> N>> M;
42      for(int i=0;i<M;i++){
43         cin >> start >> end;
44         Amap[start].push_back(end);
45         Amap[end].push_back(start);
46      }
47      for(int i=1;i<=N;i++){
48             array[0]=i;
49         dfs(i);
50      }
51      cout << sum;
52     return 0;
53 }

总结:当我们发现自己掌握的知识已经解决不了当前的问题时,我们一定要去学习,而学习到新的东西并且把问题解决的时候那种感觉真的令人很开心。就如这道题,其实我之前做题基本都是用数组,可能大部分的问题都可以用数组解决,但是如果测试数据要求数组分配的空间很大时,这是再用数组就不行了,由于之前在总结STL(https://www.cnblogs.com/henuliulei/p/10316994.html)的时候接触过vector但是在做题的时候并没有用过vector,而今天用vector把问题成功解决,真的让人感慨,多学点东西真的不吃亏,也许某天就用到了呢,,哈哈。

转载于:https://www.cnblogs.com/henuliulei/p/10492914.html

相关文章:

  • MATLAB Simulink中解算器的定步长和各模块采样时间之间的关系
  • F和Q事务
  • MOS管在开关电路中的使用
  • java学习笔记3
  • 男神鹏:python 机器学习三剑客 之 Matplotlib
  • 牛客小白月赛12
  • Django 模板继承extend 标签include block
  • hihocoder contest95 1、3、4题目分析 2赛后补题
  • Bsr.Form框架问题汇总
  • React中super(props)和super()以及不写super()的区别
  • Eclipse安装Web插件
  • 大战设计模式(第二季)【6】———— 从源码看享元模式
  • c:forEach varStatus 属性
  • Python excel 功能扩展库 —— openpyxl 的基本使用
  • python3获取自己ip
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 【Leetcode】104. 二叉树的最大深度
  • Angular4 模板式表单用法以及验证
  • javascript 总结(常用工具类的封装)
  • Java的Interrupt与线程中断
  • Objective-C 中关联引用的概念
  • Vue--数据传输
  • 前端_面试
  • 首页查询功能的一次实现过程
  • 通过git安装npm私有模块
  • RDS-Mysql 物理备份恢复到本地数据库上
  • ​linux启动进程的方式
  • #Linux(Source Insight安装及工程建立)
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (4) PIVOT 和 UPIVOT 的使用
  • (arch)linux 转换文件编码格式
  • (分布式缓存)Redis分片集群
  • (分类)KNN算法- 参数调优
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)VC++中ondraw在什么时候调用的
  • (转)详解PHP处理密码的几种方式
  • (转载)CentOS查看系统信息|CentOS查看命令
  • (转载)Linux 多线程条件变量同步
  • **python多态
  • ... 是什么 ?... 有什么用处?
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • ?php echo ?,?php echo Hello world!;?
  • @cacheable 是否缓存成功_让我们来学习学习SpringCache分布式缓存,为什么用?
  • @取消转义
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题
  • [ IOS ] iOS-控制器View的创建和生命周期
  • [2008][note]腔内级联拉曼发射的,二极管泵浦多频调Q laser——
  • [Android] Implementation vs API dependency
  • [c++] 什么是平凡类型,标准布局类型,POD类型,聚合体