求最短距离

Description

来春卒業するAさんは,就職を機に引越しをすることにしました。就職する会社は,オフィスがい くつかの町にあって、日によって出勤するオフィスが違います。そこでAさんは,どこのオフィスに 行くにも時間の短い町に住もうと考えました。

そこであなたは、Aさんを助けるため、住むのに一番便利な町を探すことになりました。

町には0から始まる番号が振られており、町と町の間には道があります。それぞれの道に対して通 勤時間が決まっています。Aさんがある町に住んでいる場合に、自分の町のオフィスまでの通勤時間 は0とします。このときに全ての町までの通勤時間の総和を考えます。例えば,町と道の配置が上の 図のようになっていて、Aさんが町1に住んだ場合には、それぞれの町までの通勤時間は

   町0まで 80
   町1まで  0
   町2まで 20
   町3まで 70
   町4まで 90

となり、総和は260となります。

道の数と、全ての道の情報を入力とし、それぞれの町に住んだ場合の通勤時間の総和を計算し、そ れが最小となる町の番号と、そのときの通勤時間の総和を出力するプログラムを作成してください。 ただし、通勤時間の総和が最小となる町が複数ある場合は、一番小さい町の番号及びその時の通勤時 間の総和を出力してください。町の総数は10以下、道の総数は45以下とし、全ての道は双方向に移動 でき、通勤時間は方向によって変わらないものとします。また、どの町からでもその他全ての町への 経路があるものとします。

Input

複数のデータセットの並びが入力として与えられます。入力の終わりはゼロひとつの行で示されま す。 各データセットは以下のとおりです。

 1行目  道の数n(整数)
 2行目  第1の道の情報 a1 b1 c1(それぞれ整数;半角空白区切り)
              各記号の意味は以下のとおりです。
              a1 b1:この道がつないでいる町の番号
              c1:a1、b1間の通勤時間
 3行目 第2の道の情報 a2 b2 c2
     :
 n+1行目 第nの道の情報 an bn cn

Output

入力データセット毎に通勤時間の総和が最小になる町の番号及びその時の通勤時間の総和を出力し ます。(半角空白区切り)

Sample Input

6
0 1 80
1 2 20
0 2 60
2 3 50
3 4 60
1 4 90
2
0 1 1
1 2 1
0

Output for the Sample Input

2 240
1 2

大意:先输入一个整数n,然后有n组数据,每组包括三个整数a,b,c代表a到b的距离是c,求从哪点出发到所有点的距离和最小。
 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<string.h>
 4 using namespace std;
 5 int main()
 6 {
 7     int t,map[12][12],sum,ans,s,i,j,k,max0,a,b,c;
 8     while(scanf("%d",&t) && t)
 9     {
10         memset(map,1,sizeof(map));
11         max0=0;
12         for(i=0;i<t;i++)
13         {
14             scanf("%d %d %d",&a,&b,&c);
15             map[a][b]=map[b][a]=c;
16             max0=max(max0,max(a,b));
17         }
18     /*    printf("%d\n\n",max0);
19          for(i=0;i<=max0;i++)
20          {
21              for(j=0;j<=max0;j++)
22              {
23                  printf("%d  ",map[i][j]);
24                  if(j == max0)
25                      printf("\n");
26              }
27          }*/
28         for(k=0;k<=max0;k++)
29         {
30             for(i=0;i<=max0;i++)
31             {
32                 for(j=0;j<=max0;j++)
33                 {
34                     map[i][j]=min(map[i][j],map[i][k]+map[k][j]);        //表示i到j的最小距离
35                 }
36             }
37         }
38         sum=10000000,ans=0;
39         for(i=0;i<=max0;i++)        //分别从0到max0出发
40         {
41             s=0;
42             for(j=0;j<=max0;j++)
43             {
44                 if(i != j)
45                 {
46                     s+=map[i][j];
47                 }
48             }
49             if(s < sum)            //比较从每个点出发的距离大小
50             {
51                 sum=s;
52                 ans=i;
53             }
54         }
55         printf("%d %d\n",ans,sum);
56     }
57 }
				
时间: 2024-10-05 10:19:53

求最短距离的相关文章

UVA 152-Tree&#39;s a Crowd(暴力求解三维坐标求最短距离)

Tree's a Crowd Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Description  Tree's a Crowd  Dr William Larch, noted plant psychologist and inventor of the phrase ``Think like a tree--Think Fig'' has invented a new

Matlab实现Flyod求最短距离及存储最优路径

Matlab实现Flyod求最短距离及存储最优路径 一.实际数据 已知图中所有节点的X.Y坐标. J01-J62:1-62; F01-F60:63-122; Z01-Z06:123-128; D01-D02:129-130. 二.Floyd求所有节点间的最小距离及通过矩阵存储最优路径的节点 1 function [ optimal,path,maxnum ] = Floyd( distance,liantong,num,p,q ) 2 %Author:ljy 3 %Date:20170919 4

迪杰斯特拉算法求最短距离

头文件: #include <memory.h> #include <stdlib.h> #include <malloc.h> #include <string.h> #include ".\source\common.h" #include "lxbasic.h" #define MAX_VEX_NUM  20 #define MAX_STR_LEN  20 #define INFINITY  999  //无穷大

Scala实现:已知三点坐标,求最短距离(如果在垂足不在线段内,最短距离为到其中一点的直线距离)

/** * 已知三点坐标,求其中一点到另两点的垂线距离 * (如果在垂足不在线段内,最短距离为到其中一点的直线距离) * Created by wzq on 17-11-2. */object Point2lineDistance { def main(args: Array[String]) { val v: Double = pointToLine(-3, 0, 3, 0, 0, 3) System.out.println(v) } def pointToLine(x1: Int, y1:

poj3714 Raid(分治求平面最近点对)

题目链接:https://vjudge.net/problem/POJ-3714 题意:给定两个点集,求最短距离. 思路:在平面最近点对基础上加了个条件,我么不访用f做标记,集合1的f为1,集合2的f为-1,那么求两个点的距离时,如果a.f*b.f=-1时计算距离,否则乘积为1的话返回inf.其它就和hdoj1007一样了. AC代码: #include<cstdio> #include<algorithm> #include<cmath> #include<cs

数据结构——图——最短路径D&amp;F算法

一.Dijkstra算法(贪心地求最短距离的算法) 在此算法中,我按照自己的理解去命名,理解起来会轻松一些. #define MAXSIZE 100 #define UNVISITED 0 #define VISITED 1 #define INFINITY 66666 typedef struct tool { int visited[MAXSIZE]; /*是否已访问的数组,visited[i]表示顶点i已经访问,也就是到顶点i的最短距离已求出*/ int known_shortest_di

1004

题意:将一些镇子连起来,求最短距离 用kruskal求最小生成树 代码: #include <iostream> #include <algorithm> using namespace std; const int N = 105; int father[N]; int find(int x) { if (x != father[x]) father[x] = find(father[x]); return father[x]; } struct edge { int x, y,

poj 3311 Hie with the Pie(状态压缩dp)

Description The Pizazz Pizzeria prides itself in delivering pizzas to its customers as fast as possible. Unfortunately, due to cutbacks, they can afford to hire only one driver to do the deliveries. He will wait for 1 or more (up to 10) orders to be

2014年百度之星程序设计大赛 - 资格赛 1002 Disk Schedule(双调欧几里得旅行商问题)

Problem Description 有很多从磁盘读取数据的需求,包括顺序读取.随机读取.为了提高效率,需要人为安排磁盘读取.然而,在现实中,这种做法很复杂.我们考虑一个相对简单的场景.磁盘有许多轨道,每个轨道有许多扇区,用于存储数据.当我们想在特定扇区来读取数据时,磁头需要跳转到特定的轨道.具体扇区进行读取操作.为了简单,我们假设磁头可以在某个轨道顺时针或逆时针匀速旋转,旋转一周的时间是360个单位时间.磁头也可以随意移动到某个轨道进行读取,每跳转到一个相邻轨道的时间为400个单位时间,跳转