zoukankan      html  css  js  c++  java
  • 【图论补完计划】poj 3613(Floyd 快速幂)

    Cow Relays
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 7463   Accepted: 2922

    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: N, T, S, 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 4
    11 4 6
    4 4 8
    8 4 9
    6 6 8
    2 6 9
    3 8 9

    Sample Output

    10
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <vector>
    #include <set>
    
    using namespace std;
    
    const int maxn=1005;
    const int inf=1e9;
    
    int mp[maxn][maxn];
    int tmp[maxn][maxn];
    int mmp[maxn][maxn];
    int res[maxn][maxn];
    int cord[maxn];
    bool used[maxn];
    
    int n,m,st,ed;
    int num;
    
    void init(){
        for(int i=0;i<maxn;i++){
            for(int j=0;j<maxn;j++){
                mp[i][j]=inf;
                tmp[i][j]=inf;
                mmp[i][j]=inf;
                res[i][j]=inf;
            }
            res[i][i]=0;
        }
    }
    
    void floyd(int a[][maxn],int b[][maxn],int c[][maxn]){
        for(int k=0;k<num;k++)
            for(int i=0;i<num;i++)
                for(int j=0;j<num;j++)
                    if(a[cord[i]][cord[j]]>b[cord[i]][cord[k]]+c[cord[k]][cord[j]])
                        a[cord[i]][cord[j]]=b[cord[i]][cord[k]]+c[cord[k]][cord[j]];
    }
    
    void trans(int a[][maxn],int b[][maxn]){
        for(int i=0;i<num;i++){
            for(int j=0;j<num;j++){
                a[cord[i]][cord[j]]=b[cord[i]][cord[j]];
                b[cord[i]][cord[j]]=inf;
            }
        }
    }
    
    void quick_mod(){
        while(n){
            if(n&1){
                floyd(mmp,res,mp);
                trans(res,mmp);
            }
            floyd(tmp,mp,mp);
            trans(mp,tmp);
            n>>=1;
        }
    }
    
    int main(){
        scanf("%d %d %d %d",&n,&m,&st,&ed);
        init();
        for(int i=0;i<m;i++){
            int u,v,w;
            scanf("%d %d %d",&w,&u,&v);
            if(!used[u]){
                used[u]=1;
                cord[num++]=u;
            }
            if(!used[v]){
                used[v]=1;
                cord[num++]=v;
            }
            mp[u][v]=mp[v][u]=min(mp[u][v],w);
        }
        quick_mod();
        printf("%d
    ",res[st][ed]);
        return 0;
    }
  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 校门外的树
    Java实现 蓝桥杯VIP 算法训练 统计单词个数
    Java实现 蓝桥杯VIP 算法训练 统计单词个数
    Java实现 蓝桥杯VIP 算法训练 开心的金明
    Java实现 蓝桥杯VIP 算法训练 开心的金明
    Java实现 蓝桥杯 算法训练 纪念品分组
    Java实现 蓝桥杯 算法训练 纪念品分组
    Java实现 蓝桥杯VIP 算法训练 校门外的树
    Java实现 蓝桥杯VIP 算法训练 统计单词个数
    Java实现 蓝桥杯VIP 算法训练 开心的金明
  • 原文地址:https://www.cnblogs.com/hymscott/p/6495992.html
Copyright © 2011-2022 走看看