hdu 2254 奥运

简介: 点击打开hdu 2254 思路: 矩阵乘法 分析: 1 题目给定一个有向图,要求t1-t2天内v1-v2的路径的个数 2 假设有向图的邻接矩阵为A,那么A表示的是有向图中走一步能够到达哪些点的方案数,那么A^n表示的是走n步能够到达哪些点的方案数 3 根据离散数学里面的可达矩阵的性质,我们知道一个有向图的邻接矩阵的前n次幂的和即为可达矩阵,那么要求[t1-t2]之内的路径的条数,因为题目说了t1 = 0的时候为0。

点击打开hdu 2254

思路: 矩阵乘法

分析:

1 题目给定一个有向图,要求t1-t2天内v1-v2的路径的个数

2 假设有向图的邻接矩阵为A,那么A表示的是有向图中走一步能够到达哪些点的方案数,那么A^n表示的是走n步能够到达哪些点的方案数

3 根据离散数学里面的可达矩阵的性质,我们知道一个有向图的邻接矩阵的前n次幂的和即为可达矩阵,那么要求[t1-t2]之内的路径的条数,因为题目说了t1 = 0的时候为0。那么假设邻接矩阵为A,那么要求的就是A^(t1-1)+A^(t1)+...+A^t2,为什么是从t1-1开始呢,因为邻接矩阵本身代表走一步的结果

3 还有点的范围很大,边数很少,所以我们应该要进行离散化

4 但是数据量很大,对于具体的一组我们应该要事先求出具体的每一个矩阵,然后直接使用即可


代码:

/************************************************
 * By: chenguolin                               * 
 * Date: 2013-08-25                             *
 * Address: http://blog.csdn.net/chenguolinblog *
 ***********************************************/
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

typedef __int64 int64;
const int MOD = 2008;
const int MAXN = 10000;
const int N = 30;

int n , pos;
int64 num[2*MAXN];
struct Edge{
    int64 x;
    int64 y;
};
Edge e[MAXN];

struct Matrix{
    int mat[N][N];
    Matrix operator*(const Matrix& m)const{
        Matrix tmp;
        for(int i = 0 ; i < pos ; i++){
            for(int j = 0 ; j < pos ; j++){
                tmp.mat[i][j] = 0;
                for(int k = 0 ; k < pos ; k++){
                    tmp.mat[i][j] += mat[i][k]*m.mat[k][j]%MOD;
                    tmp.mat[i][j] %= MOD;
                }
            }
        }
        return tmp;
    }
};
Matrix ma[MAXN];

int search(int64 x){
    int left = 0;
    int right = pos-1;
    while(left <= right){
        int mid = (left+right)>>1;
        if(num[mid] == x)
            return mid;
        else if(num[mid] < x)
            left = mid+1;
        else
            right = mid-1;
    }
    return -1;
}

void init(Matrix &m){
    memset(m.mat , 0 , sizeof(m.mat));
    sort(num , num+pos);
    pos = unique(num , num+pos)-num;
    for(int i = 0 ; i < n ; i++){
        int x = search(e[i].x);
        int y = search(e[i].y);
        m.mat[x][y]++;
    }
}

void Pow(Matrix m){
    ma[0] = m;
    for(int i = 1 ; i < MAXN ; i++)
        ma[i] = ma[i-1]*m; 
}

void solve(){
    Matrix m;
    init(m);
    Pow(m);

    int64 v1 , v2;
    int k , t1 , t2;
    scanf("%d" , &k);
    while(k--){
        scanf("%I64d%I64d%d%d" , &v1 , &v2 , &t1 , &t2); 
        if(t1 > t2 || t2 == 0){
            puts("0");
            continue;
        }
        int x = search(v1); 
        int y = search(v2); 
        if(x == -1 || y == -1){
            puts("0");
            continue;
        }
        int sum = 0;
        for(int i = t1-1 ; i < t2 ; i++){
            sum += ma[i].mat[x][y]%MOD;
            sum %= MOD;
        }
        printf("%d\n" , sum);
    }
}

int main(){
    while(scanf("%d" , &n) != EOF){
        pos = 0; 
        for(int i = 0 ; i < n ; i++){
            scanf("%I64d%I64d" , &e[i].x , &e[i].y);
            num[pos++] = e[i].x;
            num[pos++] = e[i].y;
        }
        solve();
    }
    return 0;
}



目录
相关文章
|
监控 应用服务中间件 PHP
|
11月前
|
机器学习/深度学习 存储 算法
《强化学习算法在动态环境中的优化之路》
强化学习是一种通过与环境交互以最大化累积奖励为目标的学习方法。在动态环境中,算法面临探索与利用的平衡、学习速度和稳定性等挑战。优化方法包括改进探索策略(如随机探索、基于策略的探索)、提高学习速度(如多步学习、并行学习)和增强稳定性(如经验回放、正则化)。案例表明,这些优化可显著提升智能体在动态环境中的适应能力和性能。
607 20
|
机器学习/深度学习 数据采集 算法
Python实现ISSA融合反向学习与Levy飞行策略的改进麻雀优化算法优化支持向量机分类模型(SVC算法)项目实战
Python实现ISSA融合反向学习与Levy飞行策略的改进麻雀优化算法优化支持向量机分类模型(SVC算法)项目实战
|
JSON JavaScript 中间件
深入浅出Node.js后端开发之Express框架应用
【8月更文挑战第29天】本文将带领读者快速了解并掌握使用Express框架进行Node.js后端开发的基础和进阶知识。我们将一起探索Express的安装、基本使用方法,并通过实际代码示例学习如何搭建一个简单的Web服务器。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供有价值的指导和灵感。
|
SQL 存储 分布式计算
Storm与Spark、Hadoop三种框架对比
Storm与Spark、Hadoop这三种框架,各有各的优点,每个框架都有自己的最佳应用场景。所以,在不同的应用场景下,应该选择不同的框架。
Storm与Spark、Hadoop三种框架对比
技术经验解读:不知道怎样计算权重?告诉你8种确定权重方法
技术经验解读:不知道怎样计算权重?告诉你8种确定权重方法
|
算法 数据可视化 定位技术
【用unity实现100个游戏之16】Unity程序化生成随机2D地牢游戏1(附项目源码)
【用unity实现100个游戏之16】Unity程序化生成随机2D地牢游戏1(附项目源码)
328 0
|
SQL Kubernetes 数据处理
实时计算 Flink版产品使用问题之在 flink-conf.yaml 中定义的配置在某些情况下未被正确应用到 K8s 上运行的任务管理器(JobManager)和任务管理节点(TaskManager),是什么导致的
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
Kubernetes 应用服务中间件 nginx
提升CKA认证成功率:Kubernetes Ingress七层代理全攻略!
提升CKA认证成功率:Kubernetes Ingress七层代理全攻略!
301 0
|
负载均衡 算法 网络协议
Keepalived+LVS搭建高可用负载均衡
Keepalived+LVS搭建高可用负载均衡
719 1