zoukankan      html  css  js  c++  java
  • FZU-2090 旅行社的烦恼(floyd求最小环)

    Problem 2090 旅行社的烦恼

    Accept: 122    Submit: 508
    Time Limit: 2000 mSec    Memory Limit : 32768 KB

    Problem Description

    V11开了一家旅行社,众所周知现在商业竞争越来越激烈,为了更好地吸引消费者的眼球,v11决定制定到一条最短的旅游路线,路线的开始点和结束点必须是同一个地方。你的任务就是编写程序帮助v11寻找到这样的路线。

    现在给出旅行路线图,图中有N个景点编号从1到N,有M条双向边编号从1到M。每条边包含三个数字A,B,C。表示这条路线连接景点A和景点B,他们之间的距离是C。为了简化问题,我们认为:每条旅游路线是一个至少包含三个点的简单回路。每条旅游路线的长度为它包含的所有边的距离之和。

    现在的任务是:要求你编写程序寻找这样的最短路,给出它的路程长度,并输出同时存在有几个这样的最短路。

    注意的是:

    1.当两条最短路程中所经过的景点(不考虑顺序),完全相同时,才是相同的最短路程。否则,算作不同的最短路程。

    2. 图的顶点序列中,除了第一个顶点和最后一个顶点外,其余顶点不重复出现的回路叫简单回路。(本题中将第一个顶点和最后一个顶点当作同一个景点)

    3.本题中不存在自环。

    Input

    输入数据第一行包含一个整数T,表示测试数据的组数。对于每组测试数据:

    第一行为两个整数n,m(1<n<100,1<m<5000),接下来m行,每行三个整数a,b,v(1<=a,b<=n,1<v<500),表示第i条路线连接景点A和景点B,距离是V。两个数字之间用空格隔开。

    Output

    对于每组测试数据:如果存在这样的最短路线,输出它的长度和不同的最短路线的个数。如果不存在则输出-1。两个数字之间用空格隔开,每组测试数据一行。

    Sample Input

    1 3 3 1 2 1 3 1 1 3 2 1

    Sample Output

    3 1

    Hint

    样例一中,我们可以从景点1出发的路线:1->2->3->1;

    可以从景点2出发的路线:2->3->1->2;

    同样也可以从景点3出发的路线:3->1->2->3;

    我们认为这3条路线所经过的景点集合为{1,2,3}所以他们是相同的路线。

    Source

    福州大学第九届程序设计竞赛
     
     1 #include "bits/stdc++.h"
     2 #define mem(a,b) memset(a,b,sizeof(a))
     3 using namespace std;
     4 typedef long long LL;
     5 const int MAX=105;
     6 const int oo=100000000;
     7 int cas;
     8 int n,m;
     9 int a[MAX][MAX],dist[MAX][MAX];
    10 int ans,cnt;
    11 inline int mn(int x,int y){return x<y?x:y;}
    12 void init(){
    13     int i,j;
    14     int u,v,w;
    15     scanf("%d%d",&n,&m);
    16     for (i=1;i<=n;i++) for (j=1;j<=n;j++) dist[i][j]=a[i][j]=(i==j?0:oo);
    17     for (i=1;i<=m;i++){
    18         scanf("%d%d%d",&u,&v,&w);
    19         if (w<a[u][v]){
    20             a[u][v]=a[v][u]=dist[u][v]=dist[v][u]=w;
    21         }
    22     }
    23 }
    24 void floyd(){
    25     int i,j,k;
    26     ans=oo,cnt=0;
    27     for (k=1;k<=n;k++){
    28         for (i=1;i<k;i++){
    29             for (j=i+1;j<k;j++){
    30                 if (dist[i][j]+a[i][k]+a[k][j]<ans){
    31                     ans=dist[i][j]+a[i][k]+a[k][j];
    32                     cnt=1;
    33                 }
    34                 else if (dist[i][j]+a[i][k]+a[k][j]==ans) cnt++;
    35             }
    36         }
    37         for (i=1;i<=n;i++){
    38             for (j=1;j<=n;j++){
    39                 dist[i][j]=mn(dist[i][j],dist[i][k]+dist[k][j]);
    40             }
    41          }
    42     }
    43 }
    44 int main(){
    45     freopen ("trip.in","r",stdin);
    46     freopen ("trip.out","w",stdout);
    47     int i,j;
    48     scanf("%d",&cas);
    49     while (cas--){
    50         init();
    51         floyd();
    52         if (ans==oo)
    53          puts("-1 -1");
    54         else 
    55          printf("%d %d
    ",ans,cnt);
    56     }
    57     return 0;
    58 }
    未来是什么样,未来会发生什么,谁也不知道。 但是我知道, 起码从今天开始努力, 肯定比从明天开始努力, 要快一天实现梦想。 千里之行,始于足下! ——《那年那兔那些事儿》
  • 相关阅读:
    POJ 3253 Fence Repair
    POJ 2431 Expedition
    NYOJ 269 VF
    NYOJ 456 邮票分你一半
    划分数问题 DP
    HDU 1253 胜利大逃亡
    NYOJ 294 Bot Trust
    NYOJ 36 最长公共子序列
    HDU 1555 How many days?
    01背包 (大数据)
  • 原文地址:https://www.cnblogs.com/keximeiruguo/p/6036176.html
Copyright © 2011-2022 走看看