现在的位置: 首页 > 综合 > 正文

hdu2254 矩阵

2012年09月26日 ⁄ 综合 ⁄ 共 1124字 ⁄ 字号 评论关闭
#include <iostream>
#include <cstring>
#include <cstdio>
#define MAX 35
using namespace std;
struct matrix
{
    int num[MAX][MAX];
    matrix()
    {
        memset(num,0,sizeof(num));
    }
};
int n;
long long map[MAX][MAX];
matrix A[10005];
long long  city[35];
matrix operator*(matrix &a,matrix &b)
{
    matrix t;
    int i,j,k;
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
        {
            t.num[i][j]=0;
            for(k=0;k<n;k++)
                t.num[i][j]+=(a.num[i][k]*b.num[k][j]);
            t.num[i][j]%=2008;
        }
    return t;
}

void init()
{
    int i,j;
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            A[0].num[i][j]=map[i][j];
        }
    }
}
int main()
{

    int nn;
    int Find(int u);
    while(scanf("%d",&nn)!=EOF)
    {
        int i;
        memset(map,0,sizeof(map));
        memset(city,0,sizeof(city));
        n=0;
        for(i=0;i<nn;i++)
        {
            int u,v;
            scanf("%d%d",&u,&v);
            int lo1=Find(u);
            int lo2=Find(v);
            map[lo1][lo2]++;
        }
        int k;
        init();
        for(i=1;i<10005;i++)
            A[i]=A[i-1]*A[0];
        scanf("%d",&k);
        while(k--)
        {
            int v1,v2,t1,t2;
            scanf("%d%d%d%d",&v1,&v2,&t1,&t2);
            if(t1>t2)
            {
                int t=t1;
                t1=t2;
                t2=t;
            }
            int l=n;
            int l1=Find(v1);
            int l2=Find(v2);
            if(l1>=l||l2>=l)
            {
                printf("0\n");
                n=l;
                continue;
            }

            int sum=0;
            for(i=t1-1;i<t2;i++)
                sum=(sum%2008+A[i].num[l1][l2]%2008)%2008;
            printf("%d\n",sum);
        }
    }
    return 0;
}
int Find(int u)
{
    int i;
    for(i=0;i<n;i++)
    {
        if(city[i]==u)
            break;
    }
    if(i>=n)
    {
        n++;
        city[i]=u;
        return i;
    }
    else
    {
        return i;
    }
}

抱歉!评论已关闭.