zoukankan      html  css  js  c++  java
  • sicily 1211 商人的宣传

    Description

     Bruce是K国的商人,他在A州成立了自己的公司,这次他的公司生产出了一批性能很好的产品,准备宣传活动开始后的第L天到达B州进行新品拍卖,期间Bruce打算将产品拿到各个州去做推销宣传,以增加其影响力。

    K国有很多个州,每个州都与其他一些州相邻,但是K国对商人作宣传却有一些很奇怪的规定:
    1、 商人只能从某些州到达另外一些州,即连通路线是单向的,而且有些州可能是到达不了的。
    2、 商人不允许在同一个州连续宣传两天或以上,每天宣传完必须离开该州。
    3、 商人可以多次来到同一个州进行宣传。

    "我必须找出一条影响力最大的路线才行",Bruce想,"但我首先必须知道到底有多少这种符合规定的宣传路线可供我选择。"现在Bruce把任务交给了你。并且出于考虑以后的需要,你还要帮他算出给出的两州之间的路线的总数。

    Input

    输入文件第一行包含三个整数n,m,L(1≤n,L≤100),分别表示K国的州数、连通路线的数量,以及多少天后必须到达B州。接下来有m行,每行一队整数x,y(1≤x,y≤n),表示商人能从x州到达y州。 
    第m+2行为一个整数q(1≤q≤100),表示Bruce有q个询问。下面q行每行两个整数A,B(1≤A,B≤n),即A、B州的位置。

    Output

    输出文件包含q行,每行一个整数t,为所求的从A州到B州满足上述规定的路线总数。 
    输入数据中的询问将保证答案t在长整数范围内,即t<2 31。 

    Sample Input

    4 5 6
    1 2
    2 3
    3 4
    4 1
    2 4
    2
    1 4
    4 2

    Sample Output

    2
    1

    分析:

    比较偷懒的做法是直接使用矩阵乘法。具体做法是,可以初始化地图矩阵m1所有节点为0,然后一旦联通则设为1,那么2天内由A到B的方法为M1*M1后得到的矩阵的第a行第b列,递推可以知道第l天方法数为矩阵吗m1连乘l-1次所得矩阵。这种方法写法简便,但是速度可能稍慢。

    代码:

     1 // Problem#: 1211
     2 // Submission#: 1899573
     3 // The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
     4 // URI: http://creativecommons.org/licenses/by-nc-sa/3.0/
     5 // All Copyright reserved by Informatic Lab of Sun Yat-sen University
     6 #include <iostream>
     7 #include <cstring>
     8 using namespace std;
     9 
    10 #define MAX 100
    11 
    12 int main() {
    13     int a, b;
    14     int m1[MAX][MAX] = {0};
    15     int m2[MAX][MAX] = {0};
    16     int m3[MAX][MAX] = {0};
    17     int n, m, l, q;
    18     cin >> n >> m >> l;
    19     while (m--) {
    20         cin >> a >> b;
    21         ++m1[a - 1][b - 1];
    22         ++m2[a - 1][b - 1];
    23     }
    24     for (int c = 0; c < l - 1; ++c) {
    25         memset(m3, 0, sizeof(m3));
    26         for (int i = 0; i < n; ++i) {
    27             for (int j = 0; j < n; ++j)
    28                 for(int k = 0; k < n; ++k)
    29                     m3[i][j] += m1[i][k] * m2[k][j]; 
    30         }
    31         memcpy(m1, m3, sizeof(m1));
    32     }
    33     cin >> q;
    34     while (q--) {
    35         cin >> a >> b;
    36         cout << m3[a - 1][b - 1] << endl;
    37     }
    38     return 0;
    39 }
  • 相关阅读:
    希望走过的路成为未来的基石
    第三次个人作业--用例图设计
    第二次结对作业
    第一次结对作业
    第二次个人编程作业
    第一次个人编程作业(更新至2020.02.07)
    Springboot vue 前后分离 跨域 Activiti6 工作流 集成代码生成器 shiro权限
    springcloud 项目源码 微服务 分布式 Activiti6 工作流 vue.js html 跨域 前后分离
    spring cloud springboot 框架源码 activiti工作流 前后分离 集成代码生成器
    java代码生成器 快速开发平台 二次开发 外包项目利器 springmvc SSM后台框架源码
  • 原文地址:https://www.cnblogs.com/ciel/p/2876831.html
Copyright © 2011-2022 走看看