POJ 3613 Cow Relays G++ 矩阵快速幂变形 没掌握
程序员文章站
2022-07-04 20:10:43
...
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
//英语 看博友分析 抄博友程序 矩阵快速幂变形 没掌握
int ve[1004];//抄博友 题目中给的点不是连续的
int js;
struct nod{
int zhi;
int x;
int y;
};
nod da[1004];
int vis[1004];
int val[1004];
struct mat{//抄博友背
int a[205][1004];//抄博友 第一个变量只能是205大了运行时错误 没掌握
mat()
{
memset(a,0x3f,sizeof(a));
}
mat operator* (const mat x) const//背
{
mat t;
for(int i=1;i<=js;i++)
{
for(int j=1;j<=js;j++)
{
for(int k=1;k<=js;k++)
{
t.a[i][j]=min(t.a[i][j],a[i][k]+x.a[k][j]);//抄博友程序
}
}
}
return t;
}
}jg,ba;
//mat jg;
//mat ba;
void mi(int n)//背
{
while(n)//抄博友
{
if(n&1==1)
{
jg=jg*ba;
}
ba=ba*ba;
n=n>>1;
}
}
int main()
{
int N,T,S,E;
cin>>N>>T>>S>>E;
for(int i=0;i<T;i++)
{
cin>>da[i].zhi>>da[i].x>>da[i].y;
vis[da[i].x]=vis[da[i].y]=1;
}
js=1;//
for(int i=0;i<=1004;i++)
{
if(vis[i]==1)
{
val[i]=js;
js++;
}
}
for(int i=0;i<T;i++)//背
{
int tx=val[da[i].x];
int ty=val[da[i].y];
ba.a[tx][ty]=ba.a[ty][tx]=da[i].zhi;
}
//memset(jg.a,0,sizeof(jg.a));
for(int i=1;i<js;i++)//背 不能使用单位矩阵 矩阵乘法意义不同
{
jg.a[i][i]=0;
}
mi(N);
cout<<jg.a[val[S]][val[E]]<<endl;
return 0;
}