zoukankan      html  css  js  c++  java
  • C++实现网络寻路

    标题:网络寻路

    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

    资源约定:
    峰值内存消耗 < 64M
    CPU消耗 < 1000ms

    请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

    所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

    注意: main函数需要返回0
    注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
    注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。

    提交时,注意选择所期望的编译器类型(千万不要混淆c和cpp)。

    在这里插入图片描述
    锦囊

    [题意]
    给你一个图,N个节点,M条无向边.
    问你从任意节点走3步后,到达另外一个节点的走法数有多少种(开始位置和结束位置可能相同,也就是走三元环)

    [解析]
    走3步,也就是走了三条边.
    那么我们可以枚举三条边的中间那条边为edge(u,v).
    那么: (节点u连出去的边数-1)(节点v连出去的边数-1); 就是第二步走中转边edge(u,v)的方法数.
    所以只要枚举每条边作为中转边的方法数之和为ans即可.
    因为边是双向的,所以最后答案ans
    2即为最终结果.

    只要想到通过中转边来统计,此题就是不难了.

    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <queue>
    #include <stack>
    #include <vector>
    #include <string>
    #include <map>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    typedef long long ll;
    const int N=10005;
    
    struct Road {
        int u,v;
    }road[100005];
    int n,m;
    ll in[N];
    
    int main()
    {
        int i,j,t,cas=0;
        scanf("%d",&t);
        while(t--) {
            scanf("%d%d",&n,&m);
    
            memset(in,0,sizeof(in));
            for(i=1;i<=m;i++) {
                scanf("%d%d",&road[i].u,&road[i].v);
                in[road[i].u]++; in[road[i].v]++;
            }
    
            ll ret=0;
            for(i=1;i<=m;i++) {
                int u=road[i].u;
                int v=road[i].v;
                ret+=(in[u]-1)*(in[v]-1)*2;
            }
    
            printf("Case %d: %I64d
    ",++cas,ret);
        }
        return 0;
    }
    
    
  • 相关阅读:
    结对编程的理解
    第1章 python基础
    第 3 章 前端基础之JavaScript
    第1 章 mysql数据库之简单的DDL和DML sql语句
    第 1 章 前端之html
    第 13 章 python并发编程之io模型
    第 2 章 前端基础之CSS
    第 4 章 前端基础之jquery
    第 11 章 python线程与多线程
    注册表 SAM
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13076911.html
Copyright © 2011-2022 走看看