zoukankan      html  css  js  c++  java
  • 图中长度为k的路径的计数

    Problem Description

    题目给出一个有n个节点的有向图,求该有向图中长度为k的路径条数。方便起见,节点编号为1,2,…,n,用邻接矩阵表示该有向图。该有向图的节点数不少于2并且不超过500.

    例如包含两个节点的有向图,图中有两条边1 → 2 ,2 → 1 。

    长度为1的路径有两条:1 → 2 和 2 →1 ;

    长度为2的路径有两条:1 → 2 → 1和2 → 1 → 2 ;

    偷偷告诉你也无妨,其实这个图无论k取值多少 ( k > 0 ),长度为k的路径都是2条。

    Input

    每组输入第一行是有向图中节点的数量即邻接矩阵的行列数n和K。接下来n行n列为该图的邻接矩阵。

    Output

    输出一个整数,即为图中长度为k的路径的条数。

    样例输入

    4 2

    0 1 1 0

    0 0 1 0

    0 0 0 1

    1 0 0 0

    样例输出

    6

    解法:假设从U出发到V的长度为K的路径总数为Gk[U][V],那么k=1时和边值相同,因此G1就等于图的邻接矩阵.

    假设已经得到Gk1和Gk2,那么G(k1+k2) = Gk1*Gk2.

    Gk = (G1)^k.

    所以此时候就可以用矩阵快速幂来进行求解.

     1 #include <iostream>
     2 #include <vector>
     3 #define ll long long int
     4 #define mod 10007
     5 using namespace std;
     6 typedef vector<ll> vec;
     7 typedef vector<vec> mat;
     8 
     9 mat mul(mat &a,mat &b){
    10     mat c(a.size(),vec(b[0].size()));
    11     for(int i=0;i<a.size();i++){
    12         for(int j=0;j<b[0].size();j++){
    13             for(int k=0;k<b.size();k++){
    14                 c[i][j] = (c[i][j]+a[i][k]*b[k][j]);
    15             }
    16         }
    17     }
    18     return c;
    19 }
    20 
    21 mat pow(mat a,int n){
    22     mat c(a.size(),vec(a.size()));
    23     for(int i=0;i<a.size();i++)
    24         c[i][i] = 1;
    25     while(n){
    26         if(n&1)
    27             c = mul(c,a);
    28         a = mul(a,a);
    29         n>>=1;
    30     }
    31     return c;
    32 }
    33 
    34 int main(){
    35     int n,k;
    36     cin>>n>>k;
    37     mat a(n,vec(n));
    38     for(int i=0;i<n;i++){
    39         for(int j=0;j<n;j++){
    40             cin>>a[i][j];
    41         }
    42     }
    43     a = pow(a,k);
    44     int ans = 0;
    45     for(int i=0;i<n;i++){
    46         for(int j=0;j<n;j++){
    47             ans+=a[i][j];
    48         }
    49     }
    50     cout<<ans<<endl;
    51     return 0;
    52 }
  • 相关阅读:
    进程和程序的关系
    进程和线程区别和联系
    什么是进程,进程的特征
    23.each和map函数
    22.仿淘宝五角星评论(链式编程、隐式迭代)
    19.阻止事件冒泡e.stopPropagation();
    18.阻止默认操作e.preventDefault();防止冒泡事件:e.stopPropagation()
    15.仿腾讯固定导航栏
    14.仿京东右侧边导航栏
    算法学习:树上差分
  • 原文地址:https://www.cnblogs.com/zllwxm123/p/9540391.html
Copyright © 2011-2022 走看看