• 26850: 收集数码晶体 有40%错误


    http://arena.acmclub.com/problem.php?id=26850

    数码世界的国王Shoutmon想要在n个小岛上举办一个游戏,来让数码宝贝们好好玩耍。背景是这样的:在这n个小岛之间事先安放了一些单向通道,每个通道连接两个不同的小岛,且只能按一个给定的方向通过。数码宝贝每次由通道到达一个小岛时都会令体内增加一个“数码晶体”。

    Shoutmon制定了一项规则,即数码宝贝们可以从某个小岛出发,到达一个目的小岛,如果到达目的小岛后体内的“数码晶体”数量恰好为L,那么此时可以在小岛上的兑奖处领取奖品(领完奖品后自动退出游戏)。注意,到达目的小岛后如果“数码晶体”数量不足,那么仍然可以离开小岛,直到某次回到目的小岛时“数码晶体”的数量恰好为L。每个小岛(包括起始小岛和目的小岛)与每条通道都不限制到达和通过次数。初始状态下体内的“数码晶体”数量为0。

    为了保证活动正常进行,Shoutmon想要知道,有多少条路径可以从起始小岛S到达目的小岛T并领奖(可能有多次查询)。

    输入

    每个输入文件中一组数据。

    第一行三个整数n、m、L(2<=n<=30,0<=m<=n*(n-1),1<=L<=100),分别代表小岛个数、单向通道条数、恰好需要的“数码晶体”数。

    接下来m行,每行两个整数u和v,代表从小岛u到小岛v有一条单向通道(假设小岛编号为从0到n-1)。数据保证u不等于v,且相同的有序对(u,v)最多出现一次。

    然后一个正整数k(k<=n*n),表示查询次数。

    接着k行,每行两个整数S和T,表示需要查询有多少条路径可以从起始小岛S到达目的小岛T并领奖。

    输出

    输出k行,每行一个整数,对应查询的结果,即从起始小岛到达目的小岛并领奖的路径条数。由于路径条数可能很多,因此将结果模上1000000007。

    样例输入

    3 4 4 0 1 0 2 1 2 2 0 3 1 1 0 2 2 0

    样例输出

    0 2 1

    提示

    // hahaha.cpp : 定义控制台应用程序的入口点。
    //
    
    #include <stdafx.h>
    #include <stdio.h>
    #include <iostream>
    #include <vector>
    #include <queue>
    #include <map>
    #include <string>
    #include <cstdio>
    #include <set>
    #include <algorithm>
    #include <string.h>
    
    using namespace std;
    const int maxn=31;
    int n,m,limit;
    long long hahaha[maxn][maxn][100]={0};
    bool haha[maxn][maxn][100]={false};
    
    set<int> G[maxn];
    long long query(int a,int b,int li)
        {
        if(haha[a][b][li]==true)
            {
            return hahaha[a][b][li];
            }
        long long tmp=0;
        set<int>::iterator it=G[a].find(b);
        if(it!=G[a].end()&&li==1)return 1;
        if(li==0&&a!=b)return 0;
        if(li<0)return 0;
        for(set<int>::iterator it=G[a].begin();it!=G[a].end();it++)
            {
                
                hahaha[*it][b][li-1]=(query(*it,b,li-1)+1000000007)%1000000007;
                haha[*it][b][li-1]=true;
                tmp=(tmp+hahaha[*it][b][li-1])%1000000007;
            }
        return tmp;
        }
    
    int main()
    {
    scanf("%d %d %d",&n,&m,&limit);
    for(int i=0;i<m;i++)
        {
        int a,b;
        scanf("%d %d",&a,&b);
        G[a].insert(b);
        }
    int k;
    scanf("%d",&k);
    for(int i=0;i<k;i++)
        {
        int a,b;
        scanf("%d %d",&a,&b);
        long long count=query(a,b,limit);
        long long jieguo=count%1000000007;
        printf("%lld
    ",jieguo);
        }
         
        
        return 0;
    }
    测试文件:/4.out   结果:答案错误
    	=======原因======
    	当参考答案输出:
    	280157144
    	-------时---------
    	你的程序输出:
    	0
    	=================
    测试文件:/0.out   结果:答案正确
    测试文件:/2.out   结果:答案正确
    测试文件:/3.out   结果:答案正确
    测试文件:/1.out   结果:答案错误
    	=======原因======
    	当参考答案输出:
    	505425294
    	-------时---------
    	你的程序输出:
    	0
    	=================
    

       正解

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    const int maxn = 60;
    const long long MOD = 1000000007;
    long long G[maxn][maxn], ans[maxn][maxn], temp[maxn][maxn];
    
    void MatrixPow(int n, int L) {
        for(int times = 0; times < L; times++) {
            for(int i = 0; i < n; i++) {
                for(int j = 0; j < n; j++) {
                    temp[i][j] = 0;
                    for(int k = 0; k < n; k++) {
                        temp[i][j] = (temp[i][j] + (ans[i][k] * G[k][j] % MOD + MOD)) % MOD;
                    }
                }
            }
            for(int i = 0; i < n; i++) {
                for(int j = 0; j < n; j++) {
                    ans[i][j] = temp[i][j];
                }
            }
        }
    }
    
    void init() {
        memset(G, 0, sizeof(G));
        memset(ans, 0, sizeof(ans));
        for(int i = 0; i < maxn; i++) {
            ans[i][i] = 1;
        }
    }
    
    int main() {
            init();
            int n, m, L, u, v;
            scanf("%d%d%d", &n, &m, &L);
            for(int i = 0; i < m; i++) {
                scanf("%d%d", &u, &v);
                G[u][v] = 1;
            }
            MatrixPow(n, L);
            int k;
            scanf("%d", &k);
            for(int i = 0; i < k; i++) {
                scanf("%d%d", &u, &v);
                printf("%lld
    ", (ans[u][v] % MOD + MOD) % MOD);
            }
        return 0;
    }
  • 相关阅读:
    网易严选的wkwebview测试之路
    【工程实践】服务器数据解析
    从加班论客户端开发中的建模
    UVaLive 6802 Turtle Graphics (水题,模拟)
    UVaLive 6694 Toy Boxes (二分+想法)
    UVaLive 6693 Flow Game (计算几何,线段相交)
    UVaLive 6698 Sightseeing Bus Drivers (水题,贪心)
    UVaLive 6697 Homework Evaluation (DP)
    UVALive 6692 Lucky Number (思路 + 枚举)
    CodeForces 710E Generate a String (DP)
  • 原文地址:https://www.cnblogs.com/ligen/p/4346168.html
Copyright © 2020-2023  润新知