luogu 2886 牛继电器

2019-10-03  本文已影响0人  三酒酒酒

胡扯

可能大佬们都会这题,但是如果有大佬不知道(tan90°)这种很有趣又感觉很实用的知识点的话说不定能帮点忙。

理解

对于这题思想拓展推荐大家可以去看一下国家队论文《矩阵乘法在信息学中的应用》,十分实用。
对于矩阵和递推的关系可以去看一些相关博客
对于基本的矩乘操作推荐博客http://blog.csdn.net/wust_zzwh/article/details/52058209,更深层次的就搜一搜自己get吧(:з」∠)

下面题解,没啥好注释的,拼音取名解决一切疑问(。)

#include <cstdio>
#include <cstring>
#define re register int
#define fp(i,a,b) for(re i=a,I=b;i<=I;++i)
#define min(a,b) a<b?a:b
typedef struct juzhen
{
    long long v[210][210];
}M;
M Gra,ans;
int K,T,S,E;
long long n;
long long p[2010];
M floyd(M a,M b)
{
    M c;
    memset(c.v,0x3f,sizeof(c.v));
    int i,j,k;
    fp(k,1,n)fp(i,1,n)fp(j,1,n) c.v[i][j]=min(c.v[i][j],a.v[i][k]+b.v[k][j]);
    return c;
}
void chen(int x)
{
    while(x)
    {
        if(x&1) ans=floyd(ans,Gra);
        Gra=floyd(Gra,Gra);
        x>>=1;
    }
}
int main()
{
    scanf("%d%d%d%d",&K,&T,&S,&E);
    memset(Gra.v,0x3f,sizeof(Gra.v));
    memset(ans.v,0x3f,sizeof(ans.v));
    fp(i,1,T){
        re x,y,z;
        scanf("%d%d%d",&z,&x,&y);
        if(!p[x]) p[x]=++n;if(!p[y]) p[y]=++n;
        Gra.v[p[x]][p[y]]=Gra.v[p[y]][p[x]]=min(z,Gra.v[p[y]][p[x]]);
    }
    for(int i=1;i<=n;i++) ans.v[i][i]=0;
    chen(K);
    printf("%lld",ans.v[p[S]][p[E]]);
    return 0;
}
上一篇下一篇

猜你喜欢

热点阅读