欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

POJ 3613 Cow Relays G++ 矩阵快速幂变形 没掌握

程序员文章站 2022-07-04 20:10:43
...

POJ 3613 Cow Relays G++ 矩阵快速幂变形 没掌握

POJ 3613 Cow Relays G++ 矩阵快速幂变形 没掌握

POJ 3613 Cow Relays G++ 矩阵快速幂变形 没掌握

#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; 
}