比赛 |
201712练习 |
评测结果 |
TTTTTTTTTT |
题目名称 |
奶牛接力 |
最终得分 |
0 |
用户昵称 |
yyb |
运行时间 |
10.000 s |
代码语言 |
C++ |
内存使用 |
4.85 MiB |
提交时间 |
2017-12-24 22:29:18 |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
inline int read()
{
int x=0,t=1;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
//map<int,int> M;
int M[1000100];
int tot,n;
int K,m,S,T;
int Get(int x)
{
if(M[x])return M[x];
return M[x]=++tot;
}
struct Dalao
{
int s[210][210];
int* operator [](int x){return s[x];}
void clear(){memset(s,63,sizeof(s));}
}ed,ans;
Dalao operator *(Dalao a,Dalao b)
{
Dalao ret;ret.clear();
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
for(int k=1;k<=n;++k)
ret[i][k]=min(ret[i][k],a[i][j]+b[j][k]);
return ret;
}
int main()
{
freopen("relay.in","r",stdin);
freopen("relay.out","w",stdout);
ed.clear();
K=read();m=read();S=read();T=read();
for(int i=1;i<=m;++i)
{
int W,u,v;
scanf("%d%d%d",&W,&u,&v);
//int W=read(),u=read(),v=read();
u=Get(u);v=Get(v);
ed[u][v]=ed[v][u]=min(ed[u][v],W);
}
n=tot;
ans.clear();
for(int i=1;i<=n;++i)ans[i][i]=0;
while(K)
{
if(K&1)ans=ans*ed;
ed=ed*ed;
K>>=1;
}
printf("%d\n",ans[Get(S)][Get(T)]);
}