haut 1278: Transmit information(倍增floyd)@

来源:互联网 发布:郑州慧牛网络怎么样 编辑:程序博客网 时间:2024/06/07 03:26

题意:求一个图的s到e的长度为k的最短路

解:每次只通过一个节点来疏松原图

#include <iostream>#include <bits/stdc++.h>using namespace std;typedef long long LL;const int N = 1007;const int inf = 999999999;const int mod = 10007;char str[10][10];int n, m, s, e;struct node{    int m[210][210];    node()    {        for(int i=0; i<210; i++)            for(int j=0; j<210; j++)                m[i][j]=inf;    }};int vis[2200];node quick(node &x,node &y){    node z;    for(int k=1; k<=n; k++)        for(int i=1; i<=n; i++)            for(int j=1; j<=n; j++)                z.m[i][j]=min(z.m[i][j],x.m[i][k]+y.m[k][j]);    return z;} node mul(node x,int cnt){    node y;    for(int i=1; i<=n; i++) y.m[i][i]=0;    while(cnt)    {        if(cnt&1)    y=quick(y,x);        cnt>>=1;        x=quick(x,x);    }    return y;} int main(){    int t;    scanf("%d", &t);    while(t--)    {        int k;        scanf("%d %d %d %d", &k, &m, &s, &e);         memset(vis,0,sizeof(vis));        node x;        int cnt=1;        for(int i=0; i<m; i++)        {            int w, u, v;            scanf("%d %d %d", &w, &u, &v);            if(!vis[u]) vis[u]=cnt++;            if(!vis[v]) vis[v]=cnt++;            u=vis[u],v=vis[v];            x.m[u][v]=w,x.m[v][u]=w;        }        n=cnt-1;        x=mul(x,k);        printf("%d\n",x.m[vis[s]][vis[e]]);     }     return 0;} 




原创粉丝点击