矩阵——P2886 [USACO07NOV]牛继电器Cow Relays

来源:互联网 发布:西游记唐僧知乎 编辑:程序博客网 时间:2024/06/05 20:57

https://daniu.luogu.org/problem/show?pid=2886
直接矩阵暴力就好了;
其实就是floyd;
然后么,别人离散之后快的飞起;
当然不离散也是可以过的;
自己本地测直接爆栈;

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cstdlib>#define Ll long longusing namespace std;struct jv{    int n,m;    Ll a[1001][1001];    jv(){n=m=0;memset(a,63,sizeof a);}//63==0x3f}a,ans;int n,m,k,x,y,S,E,v;jv cheng(jv a,jv b){    jv ans; ans.n=a.n; ans.m=b.m;    for(int i=1;i<=a.n;i++)        for(int k=1;k<=a.m;k++)if(a.a[i][k]<1e18)            for(int j=1;j<=b.m;j++)                ans.a[i][j]=min(ans.a[i][j],a.a[i][k]+b.a[k][j]);    return ans; }jv ksm(int y){    jv ans=a,c=a;    y-=1;    while(y){        if(y&1)ans=cheng(ans,c);        y>>=1;        c=cheng(c,c);    }    return ans;}int main(){    scanf("%d%d%d%d",&k,&n,&S,&E);    a.n=a.m=1000;    for(int i=1;i<=n;i++){        scanf("%d%d%d",&v,&x,&y);        a.a[y][x]=a.a[x][y]=v;    }    ans=ksm(k);    printf("%lld",ans.a[S][E]);}
2 0
原创粉丝点击