floyed多源最短路--Uva567

原创 2013年12月02日 20:27:03


  Risk 

Risk is a board game in which several opposing players attempt to conquer the world. The gameboard consists of a world map broken up into hypothetical countries. During a player's turn, armies stationed in one country are only allowed to attack only countries with which they share a common border. Upon conquest of that country, the armies may move into the newly conquered country.


During the course of play, a player often engages in a sequence of conquests with the goal of transferring a large mass of armies from some starting country to a destination country. Typically, one chooses the intervening countries so as to minimize the total number of countries that need to be conquered. Given a description of the gameboard with 20 countries each with between 1 and 19 connections to other countries, your task is to write a function that takes a starting country and a destination country and computes the minimum number of countries that must be conquered to reach the destination. You do not need to output the sequence of countries, just the number of countries to be conquered including the destination. For example, if starting and destination countries are neighbors, then your program should return one.


The following connection diagram illustrates the first sample input.

Input 

Input to your program will consist of a series of country configuration test sets. Each test set will consist of a board description on lines 1 through 19. The representation avoids listing every national boundary twice by only listing the fact that country I borders country J when I < J. Thus, the Ith line, where I is less than 20, contains an integer X indicating how many ``higher-numbered" countries share borders with country I, then X distinct integers J greater than I and not exceeding 20, each describing a boundary between countries I and J. Line 20 of the test set contains a single integer ( $1 \le N \le 100$) indicating the number of country pairs that follow. The next N lines each contain exactly two integers ($1 \le A,B \le 20; A \ne B$) indicating the starting and ending countries for a possible conquest.


There can be multiple test sets in the input file; your program should continue reading and processing until reaching the end of file. There will be at least one path between any two given countries in every country configuration.

Output 

For each input set, your program should print the following message ``Test Set #T" where T is the number of the test set starting with 1 (left-justified starting in column 11).

The next NT lines each will contain the result for the corresponding test in the test set - that is, the minimum number of countries to conquer. The test result line should contain the start country code A right-justified in columns 1 and 2; the string `` to " in columns 3 to 6; the destination country code B right-justified in columns 7 and 8; the string ``: " in columns 9 and 10; and a single integer indicating the minimum number of moves required to traverse from country A to country B in the test set left-justified starting in column 11. Following all result lines of each input set, your program should print a single blank line.

Sample Input 

1 3
2 3 4
3 4 5 6
1 6
1 7
2 12 13
1 8
2 9 10
1 11
1 11
2 12 17
1 14
2 14 15
2 15 16
1 16
1 19
2 18 19
1 20
1 20
5
1 20
2 9
19 5
18 19
16 20
4 2 3 5 6
1 4
3 4 10 5
5 10 11 12 19 18
2 6 7
2 7 8
2 9 10
1 9
1 10
2 11 14
3 12 13 14
3 18 17 13
4 14 15 16 17
0
0
0
2 18 20
1 19
1 20
6
1 20
8 20
15 16
11 4
7 13
2 16

Sample Output   

Test Set #1
 1 to 20: 7
 2 to  9: 5
19 to  5: 6
18 to 19: 2
16 to 20: 2

Test Set #2
 1 to 20: 4
 8 to 20: 5
15 to 16: 2
11 to  4: 1
 7 to 13: 3
 2 to 16: 4

思路:floyed求多元最短路即可,主要是注意输出格式。
下面是代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int INF=10000;
int grid[50][50];
void floyed()
{
    for(int k=1;k<=20;k++)
    {
        for(int i=1;i<=20;i++)
        {
            for(int j=1;j<=20;j++)
            if(i!=j)
            grid[i][j]=min(grid[i][j],grid[i][k]+grid[k][j]);
        }
    }
}
int main()
{
    //freopen("in.txt","r",stdin);
    int x,y;
    int loop=1;
    while(cin>>x)
    {
        for(int i=1;i<=20;i++)
        fill(grid[i],grid[i]+21,INF);
        for(int i=1;i<=x;i++)
        {
            scanf("%d",&y);
            grid[1][y]=grid[y][1]=1;
        }
        for(int i=2;i<=19;i++)
        {
            scanf("%d",&x);
            for(int j=1;j<=x;j++)
            {
                scanf("%d",&y);
                grid[i][y]=grid[y][i]=1;
            }
        }
        floyed();
        int enq;
        scanf("%d",&enq);
        cout<<"Test Set #"<<loop++<<endl;
        for(int i=1;i<=enq;i++)
        {
            scanf("%d%d",&x,&y);
            printf("%2d to %2d: %d\n",x,y,grid[x][y]);
        }
        cout<<endl;
    }
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

多源最短路算法

1. 方法: 2. Floyd算法: void Floyd() { for(i = 0; i < N; i++) { for(j = 0; j
  • u013354805
  • u013354805
  • 2016年04月05日 10:05
  • 1211

hdu2066spfa最短路+前向星 多源点多汇点

此题用纯暴力过了,但是我真没想到其他办法了!求大神指教 #include #include #include #include using namespace std; #define M...
  • luyuncheng
  • luyuncheng
  • 2012年10月11日 15:57
  • 1427

HDU 2680 Choose the best route【多源最短路,Dijkstra+spfa】

题意:输入n,m,s,分别代表车站数(顶点数),路的数量,终点位置,然后有m行数据代表车站之间的距离,再输入一个w,代表可以开始的地方,接下来就是w个点。 思路:还是最短路,但是起点有多个选择,如果...
  • hurmishine
  • hurmishine
  • 2016年07月26日 15:20
  • 907

UVALive 6378 Friend Chains (多源最短路 spfa)

多源最短路spfa+map
  • W1413882708
  • W1413882708
  • 2016年08月20日 10:52
  • 352

hdoj 2066 一个人的旅行 【多源多汇最短路】

题目:hdoj 2066 一个人的旅行 方法:缩点 + 最短路 分析:看了大神的一篇博客,讲冗余压缩的,然后就想找一个多源最短路练练手。 这个题目就是典型的多源多汇最短路 方法...
  • y990041769
  • y990041769
  • 2014年10月02日 14:32
  • 2870

FLOYD 多源最短路

获得所有顶点间的最短路,可以对每个顶点做dijkstra或者bellman,但是dijkstra麻烦而且不能有负边存在,bellman又复杂度太大。Floyd解决多元最短路很直观。 其基本思想是:对...
  • cqlf__
  • cqlf__
  • 2012年01月22日 02:08
  • 1972

hdu2066(多源多汇最短路)

题目链接:hdu2066 多源多汇,可以建立超级源点和终点 #include #include #include #include using namespace std; const i...
  • u010728156
  • u010728156
  • 2014年03月14日 11:10
  • 1265

POJ-1125& NYOJ-426- 多源最短路-spfa

给一个有向图 以i为出发起点,可以计算得到 i到所有点的最短路,取一个最大值 MAXi  问 以谁为起点,得到的MAXi最小,输出起点编号和MAXi 思路: 就是对每个人求一次最短路, 做n次sp...
  • viphong
  • viphong
  • 2015年11月13日 10:53
  • 646

POJ 1125 Stockbroker Grapevine(Floyd多源最短路)

Description Stockbrokers are known to overreact to rumours. You have been contracted to develop a m...
  • liu940204
  • liu940204
  • 2016年04月01日 20:06
  • 187

【日常学习】【floyd】codevs1077 多源最短路 题解

题目来源 codevs1077 题目描述 Description 已知n个点(n 现在有Q个询问,每个询问两个正整数,a和b,让你求a到b之间的最短路程。         满足a[i,j]=a...
  • ametake
  • ametake
  • 2015年05月05日 17:31
  • 736
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:floyed多源最短路--Uva567
举报原因:
原因补充:

(最多只允许输入30个字)