poj 3613 Cow Relays

来源:互联网 发布:u盘安装linux centos7 编辑:程序博客网 时间:2024/06/05 08:21
Cow Relays
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 5411 Accepted: 2153

Description

For their physical fitness program, N (2 ≤ N ≤ 1,000,000) cows have decided to run a relay race using the T (2 ≤ T ≤ 100) cow trails throughout the pasture.

Each trail connects two different intersections (1 ≤ I1i ≤ 1,000; 1 ≤ I2i ≤ 1,000), each of which is the termination for at least two trails. The cows know the lengthi of each trail (1 ≤ lengthi  ≤ 1,000), the two intersections the trail connects, and they know that no two intersections are directly connected by two different trails. The trails form a structure known mathematically as a graph.

To run the relay, the N cows position themselves at various intersections (some intersections might have more than one cow). They must position themselves properly so that they can hand off the baton cow-by-cow and end up at the proper finishing place.

Write a program to help position the cows. Find the shortest path that connects the starting intersection (S) and the ending intersection (E) and traverses exactly N cow trails.

Input

* Line 1: Four space-separated integers: NTS, and E
* Lines 2..T+1: Line i+1 describes trail i with three space-separated integers: lengthi , I1i , and I2i

Output

* Line 1: A single integer that is the shortest distance from intersection S to intersection E that traverses exactly N cow trails.

Sample Input

2 6 6 411 4 64 4 88 4 96 6 82 6 93 8 9

Sample Output

10


n次floyd,原来flody也可以像矩阵一样快速幂。具体的可以看论文《矩阵乘法在信息学的应用》

代码:

#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>using namespace std;const int inf=(1<<30)-1;int n;int hash[3010];//映射struct matrix{    int ma[210][210];    matrix()    {       for(int i=0;i<210;i++)          for(int j=0;j<210;j++)           ma[i][j]=inf;    }};matrix floyd(matrix x,matrix y){    matrix ans;    for(int i=1;i<=n;i++)    {        for(int j=1;j<=n;j++)        {            for(int k=1;k<=n;k++)            ans.ma[i][j]=min(ans.ma[i][j],x.ma[i][k]+y.ma[k][j]);        }    }    return ans;}matrix pow(matrix a,int m){    matrix ans;    for(int i=1;i<=n;i++)    ans.ma[i][i]=0;    while(m)    {        if(m&1)        ans=floyd(ans,a);        a=floyd(a,a);        m=m>>1;    }    return ans;}int main(){    int k,t,s,e;    while(~scanf("%d%d%d%d",&k,&t,&s,&e))    {        int x,y,d;        memset(hash,0,sizeof(hash));        n=1;        matrix a;        for(int i=0;i<t;i++)        {            scanf("%d%d%d",&d,&x,&y);            if(!hash[x])            hash[x]=n++;            if(!hash[y])            hash[y]=n++;            a.ma[hash[x]][hash[y]]=a.ma[hash[y]][hash[x]]=d;        }        n=n-1;        matrix ans;        ans=pow(a,k);        printf("%d\n",ans.ma[hash[s]][hash[e]]);    }    return 0;}


0 0
原创粉丝点击