fzu 2173 floyd+矩阵快速幂

#include<stdio.h>
#define inf 1000000000000000
#define N 100
long long tmp[N][N],ma[N][N];
int n;
long long min(long long a,long long b)
{
    return a<b?a:b;
}
void floy(long long  a[N][N])
{
    int i,j,k;
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            tmp[i][j]=inf;
      for(k=1;k<=n;k++)
        for(i=1;i<=n;i++)
          for(j=1;j<=n;j++)
            tmp[i][j]=min(tmp[i][j],a[i][k]+ma[k][j]);
      for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
          a[i][j]=tmp[i][j];
}
void f(int k,long long dis[N][N])
{
    k--;
    while(k)
    {
        if(k&1)
            floy(dis);
        floy(ma);
        k=k/2;
    }
}
int main()
{
    int t,m,k,i,j,u,v;
    long long cost;
    long long dis[N][N];
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d%d",&n,&m,&k);
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
           {
                ma[i][j]=inf; dis[i][j]=inf;
            }
        for(i=1;i<=m;i++)
        {
            scanf("%d%d%I64d",&u,&v,&cost);
            if(ma[u][v]>cost){  ma[u][v]=cost;
            dis[u][v]=ma[u][v];
            }
        }
        f(k,dis);
        if(dis[1][n]>=inf)  printf("-1\n");
        else   printf("%I64d\n",dis[1][n]);
    }
    return 0;
}
posted @ 2014-04-30 12:17  HYDhyd  阅读(163)  评论(0编辑  收藏  举报