zoukankan      html  css  js  c++  java
  • 【USACO07FEB】 Cow Relays

    【题目链接】
                 点击打开链接
    【算法】
               朴素算法,就是跑N-1遍floyd
               而满分算法就是通过矩阵快速幂加速这个过程
    【代码】
              注意要离散一下

              

    #include <algorithm>
    #include <bitset>
    #include <cctype>
    #include <cerrno>
    #include <clocale>
    #include <cmath>
    #include <complex>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <ctime>
    #include <deque>
    #include <exception>
    #include <fstream>
    #include <functional>
    #include <limits>
    #include <list>
    #include <map>
    #include <iomanip>
    #include <ios>
    #include <iosfwd>
    #include <iostream>
    #include <istream>
    #include <ostream>
    #include <queue>
    #include <set>
    #include <sstream>
    #include <stdexcept>
    #include <streambuf>
    #include <string>
    #include <utility>
    #include <vector>
    #include <cwchar>
    #include <cwctype>
    #include <stack>
    #include <limits.h>
    using namespace std;
    #define MAXP 250
    #define MAXC 1010
    const int INF = 1e9;
    
    int N,T,S,E,i,j,l,u,v,tot;
    int h[MAXC];
    
    struct Matrix
    {
        int mat[MAXP][MAXP];
    } ans;
    
    inline void multipy(Matrix &a,Matrix b)
    {
        int i,j,k;
        static Matrix ans;
        for (i = 1; i <= tot; i++)
        {
            for (j = 1; j <= tot; j++)
            {
                    ans.mat[i][j] = INF;
            }
        }
        for (i = 1; i <= tot; i++)
        {
            for (j = 1; j <= tot; j++)
            {
                for (k = 1; k <= tot; k++)
                {
                    ans.mat[i][j] = min(ans.mat[i][j],a.mat[i][k]+b.mat[k][j]);
                }
            }
        }
        a = ans;
    }
    
    inline void power(Matrix &a,int n)
    {
        int i,j;
        static Matrix ans=a,p=a;
        n--;
        while (n > 0)
        {
            if (n & 1) multipy(ans,p);
            n >>= 1;
            multipy(p,p);
        }
        a = ans;
    }
    
    int main()
    {
        
        for (i = 1; i < MAXP; i++)
        {
            for (j = 1; j < MAXP; j++)
            {
                ans.mat[i][j] = INF;
            }
        }
        scanf("%d%d%d%d",&N,&T,&S,&E);
        for (i = 1; i <= T; i++)
        {
            scanf("%d%d%d",&l,&u,&v);
            if (!h[u]) h[u] = ++tot;
            if (!h[v]) h[v] = ++tot;
            ans.mat[h[u]][h[v]]= ans.mat[h[v]][h[u]] = min(ans.mat[h[u]][h[v]],l);
        }
        power(ans,N);
        printf("%d
    ",ans.mat[h[S]][h[E]]);
        
        return 0;
    } 
  • 相关阅读:
    我用自己做的图书比价搜索买了一本书
    2.17
    最近的工作
    FireBug的Bug
    2.18
    tecent面试题解答
    .net杂记
    python的round测试
    最近在网上买书的体会
    关于迅雷评论的一个改造html css
  • 原文地址:https://www.cnblogs.com/evenbao/p/9196314.html
Copyright © 2011-2022 走看看