uva 567 - Risk

 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 (

)
indicating the number of country pairs that follow.
The next N lines each
contain exactly two integers (

)
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
#include <iostream>
#include <stack>
#include <cstring>
#include <cstdio>
#include <string>
#include <algorithm>
#include <queue>
#include <set>
#include <map>
#include <fstream>
#include <stack>
#include <list>
#include <sstream>
#include <cmath>

using namespace std;

#define ms(arr, val) memset(arr, val, sizeof(arr))
#define mc(dest, src) memcpy(dest, src, sizeof(src))
#define N 25
#define INF 0x3fffffff
#define vint vector<int>
#define setint set<int>
#define mint map<int, int>
#define lint list<int>
#define sch stack<char>
#define qch queue<char>
#define sint stack<int>
#define qint queue<int>
/*弗洛伊德算法*/
int g[N][N];

void floyd()
{
    for (int k = 1; k <= 20; k++)
    {
        for (int i = 1; i <= 20; i++)
        {
            for (int j = 1; j <= 20; j++)
            {
                if (g[i][j] > g[i][k] + g[k][j])
                {
                    g[i][j] = g[i][k] + g[k][j];
                }
            }
        }
    }
}

int main()
{
    int n, cs = 1, t;
    while (~scanf("%d", &n))
    {
        for (int i = 1; i <= 20; i++)
        {
            for (int j = 1; j <= 20; j++)
            {
                g[i][j] = INF;
            }
        }
        for (int i = 0; i < n; i++)
        {
            scanf("%d", &t);
            g[1][t] = g[t][1] = 1;
        }

        for (int i = 2; i <= 19; i++)
        {
            scanf("%d", &n);
            for (int j = 0; j < n; j++)
            {
                scanf("%d", &t);
                g[i][t] = g[t][i] = 1;
            }
        }
        floyd();
        printf("Test Set #%d\n", cs++);
        scanf("%d", &n);
        int s, e;
        while (n--)
        {
            scanf("%d%d", &s, &e);
            printf("%2d to %2d: %d\n", s, e, g[s][e]);
        }
        putchar(‘\n‘);
    }
    return 0;
}

uva 567 - Risk,布布扣,bubuko.com

时间: 2024-08-06 01:04:01

uva 567 - Risk的相关文章

UVA 567 Risk【floyd】

题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=508 题意:20个点的任意最短路.floyd 代码: #include <stdio.h> #include <ctime> #include <math.h> #include <string> #include <iter

uva 567 Risk bfs

#include <cstdio> #include <iostream> #include <algorithm> #include <queue> #include <cstring> using namespace std; int ma[25][25]; int d[25]; int vis[25]; int fun(int x,int y){ queue<int> que; que.push(x); vis[x] = 1;

UVA - 567 Risk(Floyd)

题目链接 题目大意:有20个城市,输入给19行,每行先给有几个数,然后接着给出这几个数,代表的是后面的城市编号和行编号(城市编号)有一条边,每条边的权值为1.接着m个查询任意两个城市之间的最短距离. 解题思路:求任意两个顶点之间的距离,用floyd. 代码: #include <cstdio> const int maxn = 21; const int INF = 0x3f3f3f3f; int G[maxn][maxn]; void Floyd () { for (int k = 1; k

uva oj 567 - Risk(Floyd算法)

1 /* 2 一张有20个顶点的图上. 3 依次输入每个点与哪些点直接相连. 4 并且多次询问两点间,最短需要经过几条路才能从一点到达另一点. 5 6 bfs 水过 7 */ 8 #include<iostream> 9 #include<cstring> 10 #include<vector> 11 #include<cstdio> 12 #include<queue> 13 using namespace std; 14 15 struct

UVA - 12264 Risk

题意比较坑,移动完以后的士兵不能再次移动,不然样例都过不了... 最小值最大所以二分答案,跑网络流验证是否可行. 这种题重点在建图,为了保证只移动一次,拆点,一个入点一个出点,到了出点的自然不能再次调度. 不在边界上的边连一条容量为1的边表示至少留一个人,在边界上的与T的连边就设置成mid. 其他细节: 注意二分答案的时候如果是l=mid+1,r=mid这样的(l+r)/2向下取整, l=mid,r=mid-1则(l+r)/2向上取整,否则遇到如r = l+1判断后执行l = mid这种情况就会

UVA题目分类

题目 Volume 0. Getting Started 开始10055 - Hashmat the Brave Warrior 10071 - Back to High School Physics 10300 - Ecological Premium 458 - The Decoder 494 - Kindergarten Counting Game 414 - Machined Surfaces 490 - Rotating Sentences 445 - Marvelous Mazes

Risk UVA - 12264 拆点法+最大流+二分

/** 题目:Risk UVA - 12264 链接:https://vjudge.net/problem/UVA-12264 题意:给n个点的无权无向图(n<=100),每个点有一个非负数ai. 若ai==0则此点归敌方所有,若ai>0则此点归你且上面有ai个属于你的士兵. 保证至少有一个属于你的点与敌方的点相邻.你可以让你的每个士兵最多移动一次 ,每次可以待在原地或者去到相邻的属于你的领地,但每个点至少要留1各士兵, 使得最薄弱的关口尽量坚固.关口是指与敌方点相邻的点,薄弱与坚固分别指兵少

UVA 563 Crimewave (最大流,拆点)

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=504  Crimewave  Nieuw Knollendam is a very modern town. This becomes clear already when looking at the layout of its map, which is just a rectangula

UVA 1025 A Spy in the Metro(DP)

Secret agent Maria was sent to Algorithms City to carry out an especially dangerous mission. After several thrilling events we find her in the first station of Algorithms City Metro, examining the time table. The Algorithms City Metro consists of a s