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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值