zoukankan      html  css  js  c++  java
  • 路径搜索——网络寻路

    作者: kent鹏  

    转载请注明出处:http://www.cnblogs.com/xieyupeng/p/7236021.html 

    标题:网络寻路

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

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

    如图1所示的网络。

    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)。

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

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

    例如:
    用户输入:
    3 3
    1 2
    2 3
    1 3
    则程序应该输出:
    6


    再例如:
    用户输入:
    4 4
    1 2
    2 3
    3 1
    1 4
    则程序应该输出:
    10

    #include <iostream>
    #include <map>
    #include <vector>
    using namespace std;
    
    int cou=0;
    
    int main()
    {
        int n,m,a,b;
        
        map< int,vector<int> > tr;//存放数据 
        
        cin >> n >> m;
        
        while(m--) //建立map  Maps是一种关联式容器,包含“关键字/值”对
        {
            cin >> a >> b ;
            
            tr[a].push_back(b);
            tr[b].push_back(a);
        }
        
        map< int,vector<int> >::iterator it = tr.begin(); //创建迭代器 逐个遍历关键词 
        for(;it!=tr.end();it++)
        {    
            int i = it->first; //first表示关键字的值 因为是在map里面 所以要拿值就要同first 第二个值就用second 
            //1 2 3 4
            //cout << i;
            
            //vector<int> &tr2 = tr[i]; //通过关键字 继续搜索关键中存放的vector 
            //对每一个关键字 访问他的vector 
            vector<int>::iterator it2 = it->second.begin(); //创建迭代器 来遍历vector 
            for(;it2!=it->second.end();it2++)
            {
                int i2 = *it2 ; 
                
                vector<int> &tr3 = tr[i2];
                vector<int>::iterator it3 = tr3.begin();
                for(;it3!=tr3.end();it3++)
                {
                    int i3 = *it3;
                    if(i3==i) continue;
                    vector<int> &tr4 = tr[i3];
                    vector<int>::iterator it4 = tr4.begin();
                    for(;it4!=tr4.end();it4++)
                    {
                        int i4 = *it4;
                        if(i4==i2) continue;
                        cou++;
                        
                    }
                }
                    
            }
            //cout << endl;    
        }
        
        cout << cou;
        
        return 0;
    }
    map vector for循环实现
  • 相关阅读:
    大写的服,看完这篇你还不懂RocketMQ算我输
    写一个通用的幂等组件,我觉得很有必要
    如何将分布式锁封装的更优雅
    哇,ElasticSearch多字段权重排序居然可以这么玩
    每日一道 LeetCode (52):三数之和
    JVM 第六篇:极致优化 IDEA 启动速度
    JVM 第五篇:命令行 JVM 故障处理工具
    JVM 第四篇:可视化 JVM 故障处理工具
    JVM 第三篇:Java 类加载机制
    JVM 第二篇:垃圾收集器以及算法
  • 原文地址:https://www.cnblogs.com/xieyupeng/p/7236021.html
Copyright © 2011-2022 走看看