图论题.docx

上传人:b****6 文档编号:5946525 上传时间:2023-01-02 格式:DOCX 页数:15 大小:40.03KB
下载 相关 举报
图论题.docx_第1页
第1页 / 共15页
图论题.docx_第2页
第2页 / 共15页
图论题.docx_第3页
第3页 / 共15页
图论题.docx_第4页
第4页 / 共15页
图论题.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

图论题.docx

《图论题.docx》由会员分享,可在线阅读,更多相关《图论题.docx(15页珍藏版)》请在冰豆网上搜索。

图论题.docx

图论题

一.拦截匪徒

源程序名   catch.?

?

?

(pas,c,cpp)

可执行文件名catch.exe

输入文件名  catch.in

输出文件名catch.out

运行时限1s

问题描述:

某市的地图是一个由n个点组成的无向图,每个点代表一个区。

现在第p区发生了抢劫案,而警察为了截住匪徒埋伏在一个匪徒必经的区域。

由于不知道匪徒会向哪个区域逃窜,局长要求身为警察局电脑专家的你计算出对于任意一个匪徒可能逃向的区j,找出一个可以截住匪徒的区k,即匪徒从p区逃向j区,必经过k区。

由于地区j可能为匪徒的老巢所在,所以局长希望在路上拦住匪徒,而不是在j区抓捕。

输入格式:

第一行为n,p(1≤p≤n≤100)。

接下来为n*n的矩阵A,A[i,j]=1表示i区和j区有路相连,反之为0。

输出格式:

输出n-1行,按顺序从j=1,2,……,n依次输出对于每一个j,警察可以在哪些点埋伏。

如有多个点,则要按照从小到大的顺序依次输出;如没有,则对应行输出“NO”。

输入样例:

51

01100

10110

11000

01001

00010

输出样例:

NO

NO

2

24

二.房间问题

程序名称:

castle.pas,c,c++

输入文件:

castle.in

输出文件:

castle.out

问题描述:

一座城堡被分成m*n个方块(m≤50,n≤50),每个方块可有0~4堵墙(0表示无墙)。

下面示出了建筑平面图:

图中的加粗黑线代表墙。

几个连通的方块组成房间,房间与房间之间一定是用黑线(墙)隔开的。

现在要求你编一个程序,解决以下三个问题:

1、该城堡中有多少个房间;

  2、最大的房间有多大;

  3、拆除城堡中的某一堵墙(城堡最外一圈的围墙不能拆),以形成一个尽可能大的房间。

指出该墙。

输入数据:

  平面图以数字形式存储在castle.in文件中,用一个数字表示一个方块。

 ●第一行一个整数m(m≤50),表示房子南北方向的长度。

第二行一个整数n(n≤50),表示房子东西方向的长度。

 ●后面的m行,每行有n个整数,每个整数都表示平面图对应位置的方块的特征。

每个方块中墙的特征由数字P来描述(0≤P≤15)。

数字P是下面的可能取的数字之和:

  1(西墙west)

  2(北墙north)

  4(东墙east)

  8(南墙south)

  室内的墙被定义两次:

例如方块(1,1)中的南墙也被位于其南面的方块(2,1)定义了一次。

 ●建筑中至少有两个房间。

输出数据:

  在输出文件castle.out中,

  第1行:

一个整数,表示房间总数;

  第2行:

一个整数,表示最大房间的面积(方块数);

  第3行:

两个整数i、j(i和j是方格的坐标)和一个表示方向的字母D(D=W、N、E或S),表示应拆除哪个方格哪个方向上的一堵墙。

只要求输出一个解。

输入样例:

4

7

1161163106

796135155

1101271375

1311108101213

输出样例:

5

9

41E

 

注释:

下图中用虚黑线标出的就是去掉的墙。

三.程序文件snow.PAS/C/CPP

可执行文件snow.EXE

输入文件snow.IN

输出文件snow.OUT

时间限制1S

问题描述:

随着白天越来越短夜晚越来越长,我们不得不考虑铲雪问题了。

整个城市所有的道路都是双向一个车道,因为城市预算的削减,整个城市只有1辆铲雪车。

铲雪车只能把它开过的地方(车道)的雪铲干净,无论哪儿有雪,铲雪车都得从停放的地方出发,游历整个城市的街道。

现在的问题是:

最少要花多少时间去铲掉所有道路上的雪呢?

输入:

输入数据的第1行表示铲雪车的停放坐标(x,y),x,y为整数,单位为米。

下面最多有100行,每行给出了一条街道的起点坐标和终点坐标,所有街道都是笔直的,且都是双向一个车道。

铲雪车可以在任意交叉口、或任何街道的末尾任意转向,包括转U型弯。

铲雪车铲雪时前进速度为20km/h,不铲雪时前进速度为50km/h。

保证:

铲雪车从起点一定可以到达任何街道。

输出:

铲掉所有街道上的雪并且返回出发点的最短时间,精确到分种。

输入样例:

00

001000010000

5000-10000500010000

5000100001000010000

输出样例:

3:

55

注解:

3小时55分钟

四.单词游戏

Io和Ao在玩一个单词游戏。

他们轮流说出一个仅包含元音字母的单词,并且后一个单词的第一个字母必须与前一个单词的最后一个字母一致。

游戏可以从任何一个单词开始。

  任何单词禁止说两遍,游戏中只能使用给定词典中含有的单词。

  游戏的复杂度定义为游戏中所使用的单词的长度总和。

  编写程序求出使用一本给定的词典来玩这个游戏所能达到的游戏最大可能复杂度。

输入words.in

  输入文件的第一行包含一个自然数N,1≤N≤16,N表示一本字典中包含的单词数量。

以下的每一行包含字典中的一个单词,每一个单词是由字母A、E、I、O和U组成的一个字符串,每个单词的长度将小于等于100,所有的单词是不一样的。

输出words.out

  输出文件仅有一行包含该游戏的最大可能复杂度。

样例

words.in

5

IOO

IUUO

AI

OIOOI

AOOI

words.out

16

五.删边问题(edges.pas)

问题描述:

连通图是指任意两个顶点都有路径可互相到达的图。

读入一个无向的连通图,输出最多能删掉多少条边,使这个图仍然连通。

输入文件(edges.in):

第一行为图的顶点数N(1≤N≤100)和边数M,它们之间用一个空格隔开,图中的顶点用1到N的整数标号。

接下来的M行,每行用两个数V1和V2表示一条边。

V1与V2用一个空格隔开,表示这条边所连接的顶点的标号(V1≠V2),同一条边不会重复出现。

输出文件(edges.out):

输出仅有一个整数,即最多能删掉的边数。

样例:

输入:

46

12

13

14

23

24

34

输出:

3

六.相连的城市(city.pas)

问题描述:

n个城市中,某些城市间有道路互相连接。

给出与每个城市相邻的城市有多少个,请输出城市间的邻接矩阵。

输入文件(city.in):

第一行输入一个正整数n,表示城市的个数。

第二行输入n个用空格隔开的非负整数,其中第i个数表示与城市i相邻的城市有多少个。

输出文件(city.out):

输出满足输入数据的邻接矩阵。

也就是说,你的输出应该一个关于对角线对称的NxN的01矩阵。

输出的数需要用空格隔开。

如果没有满足条件的邻接矩阵,请输出“NoSolution”。

如果有多种可能的邻接矩阵,你可以任意输出一个。

样例:

输入:

7

4315421

输出(不唯一):

0101101

1001100

0001000

1110110

1101010

0001100

1000000

数据规模:

对于30%的数据,n<=3;

对于50%的数据,n<=30;

对于70%的数据,n<=300;

对于100%的数据,n<=3000;

七.警察局(police.pas)

问题描述:

很久很久以前,国王拥有着Byteland的全部领土。

Byteland由N个城市组成,而且某些城市有道路相连。

不过,由于马车相向而行是非常危险的,所以道路都修成单向的。

  有一天,国王决定在Byteland的若干不同城市设置警察局。

不过由于经济原因,国王只能建立K个警察局。

当然了,国王建立的警察局必须符合如下条件:

●除非某城市已经建立了警察局,从每个城市出发,都能达到某个有警察局的城市。

●任意城市一旦发生危险,总有警察局能够派出人员到达那个城市。

国王想知道一共有多少种不同的方案。

输入文件(police.in):

第一行N(1<=N<=100)、M(1<=M<=20000)和K(1<=k<=n),代表了城市的个数、道路的个数以及建设的警察局数。

以后M行,每行两个整数i、j,表示有一条从i城市到j城市的道路。

输出文件(police.out):

输出一行,为建立K个警察局的不同方案数。

样例:

输入:

673

12

23

31

34

45

56

65

输出:

15

八、CowHurdles

(hurdles.pas)

农场主John要为他的母牛参加跳跃比赛做一些准备工作,因此Bessie和它的伙伴在练习跳过障碍物。

它们感到很累,因此,他们想用最少的体力跳过障碍物。

很明显,对母牛来讲跳过几个很短的障碍物不是什么很困难的事,如果是一个高的障碍物那就有点困难了。

因此,母牛们仅仅关心他们要跳的最高的障碍物的高度。

母牛们练习的房间有N(1<=N<=300)个位置,很方便地标记为1..N。

M条单行道连接着各个位置,这些单行道标记为1..M。

第i条单行道表示从位置S_i到E_i且路上有一个高度为H_i(1<=H_i<=1,000,000)的障碍物。

母牛们必须跳过所有通过的道路上的障碍物。

母牛们有T(1<=T<=40,000)个任务必须完成。

任务i包含两个不同的数,A_i和B_i(1<=A_i<=N;1<=B_i<=N),这意味着母牛们必须从位置A_i到B_i(通过一条或多条路)。

母牛们想要找到从A_i到B_i所通过的一条路径,要求所跳过的最高障碍物的高度值最小。

请你写个程序帮助母牛们求出跳过的最高障碍物的最小高度值。

程序名:

hurdles

输入格式:

第一行:

三个用空格隔开的整数N,M和T

第2..M+1行:

第i+1行有三个用空格隔开的整数S_i,E_i和H_i

第M+2..M+T+1行:

第i+M+1行每行有两个用空格隔开的表示任务i的整数A_i和B_i

样例输入(hurdles.in):

563

1212

328

135

253

344

248

34

12

51

输出格式:

第1..T行:

第i行是任务i的结果(两位置之间最高障碍物的最小值)。

如果两位置之间无通路则输出-1。

样例输出(hurdles.out):

4

8

-1

九、挖水井

农夫约翰决定给他的N(1<=N<=300)个牧场浇水,这些牧场被自然的命名为1..N。

他可以给一个牧场引入水通过在这个牧场挖一口井或者修一条管道使这个牧场和一个已经有水的牧场连接。

在牧场i挖一口井的花费是w_i(1<=w_i<=100000)。

修建一条水管连接牧场i和牧场j的花费是p_ij(1<=p_ij<=100000;p_ij=p_ji;p_ii=0)。

请确定农夫约翰为了完成浇灌所有的牧场所需的最小的总花费。

分数:

400

题目名称:

water

输入格式:

第1行:

一个单独的整数n。

第2..n+1行:

第i+1行包含一个单独的整数w_i。

第n+2..2n+1行:

第n+1+i行包含n个用空可分开的整数;其中第j个数是p_ij。

输入样例(water.in):

4

5

4

4

3

0222

2033

2304

2340

输入说明:

这里有4个牧场,修井和修管道的代价如图。

输出格式:

第1行:

一个单独的整数,表示花费。

输出样例(water.out):

9

输出说明:

农夫约翰可以在第4个牧场修井,并且将每个牧场和第一个连接起来,这样,花费是3+2+2+2=9。

 

十、最小花费(money.?

?

?

问题描述

在n个人中,某些人的银行账号之间可以互相转账。

这些人之间转账的手续费各不相同。

给定这些人之间转账时需要从转账金额里扣除百分之几的手续费,请问A最少需要多少钱使得转账后B收到100元。

输入数据

第一行输入两个正整数n,m,分别表示总人数和可以互相转账的人的对数。

以下m行每行输入三个正整数x,y,z,表示标号为x的人和标号为y的人之间互相转账需要扣除z%的手续费(z<100)。

最后一行输入两个正整数A,B。

数据保证A与B之间可以直接或间接地转账。

输出数据

输出A使得B到账100元最少需要的总费用。

精确到小数点后8位。

输入样例

33

121

232

133

13

输出样例

103.07153164

时间限制

各测试点1秒

内存限制

你的程序将被分配40MB的运行空间

数据规模

1<=n<=2000

十一、架设电话线(phoneline.pas)

FarmerJohn打算将电话线引到自己的农场,但电信公司并不打算为他提供

免费服务。

于是,FJ必须为此向电信公司支付一定的费用。

FJ的农场周围分布着N(1=N=1,000)根按1..N顺次编号的废弃的电话线

杆,任意两根电话线杆间都没有电话线相连。

一共P(1=P=10,000)对电话

线杆间可以拉电话线,其余的那些由于隔得太远而无法被连接。

第i对电话线杆的两个端点分别为A_i、B_i,它们间的距离为

L_i(1=L_i=1,000,000)。

数据中保证每对{A_i,B_i}最多只出现1次。

编号为1的电话线杆已经接入了全国的电话网络,整个农场的电话线全都连到了

编号为N的电话线杆上。

也就是说,FJ的任务仅仅是找一条将1号和N号电话线杆

连起来的路径,其余的电话线杆并不一定要连入电话网络。

经过谈判,电信公司最终同意免费为FJ连结K(0=KN)对由FJ指定的电

话线杆。

对于此外的那些电话线,FJ需要为它们付的费用,等于其中最长的电话

线的长度(每根电话线仅连结一对电话线杆)。

如果需要连结的电话线杆不超过

K对,那么FJ的总支出为0。

请你计算一下,FJ最少需要在电话线上花多少钱。

程序名phoneline

输入格式

第1行3个用空格隔开的整数:

N,P,以及K

第2..P+1行第i+1行为3个用空格隔开的整数:

A_i,B_i,L_i

输入样例(phoneline.in)

571

125

314

248

323

529

347

456

输入说明

一共有5根废弃的电话线杆。

电话线杆1不能直接与电话线杆4、5相连。

电话

线杆5不能直接与电话线杆1、3相连。

其余所有电话线杆间均可拉电话线。

电信

公司可以免费为FJ连结一对电话线杆。

输出格式

第1行输出1个整数,为FJ在这项工程上的最小支出。

如果任务不可能完成,

输出-1

输出样例(phoneline.out)

4

输出说明

FJ选择如下的连结方案:

1-3;3-2;2-5,这3对电话线杆间需要的

电话线的长度分别为4、3、9。

FJ让电信公司提供那条长度为9的电话线,于是,

他所需要购买的电话线的最大长度为4。

 

十二、恶魔城(SATANIC.PAS)

问题描述:

上帝需要创造一位战士去消灭撒旦,这位战士必须要穿过恶魔城才能与撒旦决斗。

恶魔城内有M条连接N个路口(从1到N编号)的街道,每一条街道都是单向的(也就是说你不能逆着该街道指定的方向走),并且在城内无论怎么走都不可能走回原来走过的地方。

开始的时候,战士的生命力(HP)为INITHP、站在1号路口,而撒旦在第N号路口等待着他。

每一条街道上都有许多魔鬼,但是也有一些街道已经被上帝派去的天使占领了。

当战士经过连接i号向j号路口的街道时,如果占领该街道的是恶魔,那么他的HP先加倍然后减少L[i,j],我们记为A[i,j]=-L[i,j];如果占领该街道的是天使,那么他的HP就会先加倍然后增加L[i,j],我们记为A[i,j]=+L[i,j];如果该街道不存在,那么A[i,j]=0。

如果某一时刻战士的HP<=0,那么他会死亡。

因为这个战士将非常无敌,当他见到撒旦的时候只要还活着,就能一口气把撒旦消灭,所以上帝不希望让他的INITHP过高。

任务:

给定N,A[1..N,1..N],求最小的INITHP,使这个战士能够活着见到撒旦。

输入格式:

从文件SATANIC.IN读入数据,文件第一行有一个正整数N(3≤N≤100),下面跟着的第i行第j个数为A[i,j](绝对值不超过10000的整数)。

输出格式:

输出所求最小的INITHP。

样例

SATANIC.in

SATANIC.out

4

0-40–10

00+30

000–14

0000

4

 

十三、路障

源程序名block.?

?

?

(pas|c|cpp)

输入文件名block.in

输出文件名block.out

-问题描述

Bessie来到一个小农场,有时她想回老家看看她的一位好友。

她不想太早地回到老家,因为她喜欢途中的美丽风景。

她决定选择次短路径,而不是最短路径。

农村有R(1<=R<=100,000)条双向的路,每条路连接N(1<=N<=5000)个结点中的两个。

结点的编号是1..N。

Bessie从结点1出发,她的朋友(目的地)在结点N。

次短路径可以使用最短路径上的路,而且允许退回,即到达一个结点超过一次。

次短路径是一种长度大于最短路径的路径(如果存在两条或多条最短路径存在,次短路径就是比它们长,且不比其他任何的路径长的路径)。

-输入数据

*Line1:

两个用空格分隔的整数N和R

*Lines2..R+1:

每行包含三个用空格分隔的整数:

A,B,和D表示有一条路连接

结点A和B,长度为D(1<=D<=5000)。

-输出数据

*Line1:

结点1到结点N的次短路径长度。

-样例输入

44

12100

24200

23250

34100

-样例输出

450

 

十四、Danger(danger.pas)

【问题描述】

天凯是苏联的总书记。

苏联有n个城市,某些城市之间修筑了公路。

任意两个城市都可以通过公路直接或者间接到达。

天凯发现有些公路被毁坏之后会造成某两个城市之间无法互相通过公路到达。

这样的公路就被称为dangerouspavement。

为了防止美帝国对dangerouspavement进行轰炸,造成某些城市的地面运输中断,天凯决定在所有的dangerouspavement驻扎重兵。

可是到底哪些是dangerouspavement呢?

你的任务就是找出所有这样的公路。

【输入格式】

第一行n,m(1<=n<=150,1<=m<=5000),分别表示有n个城市,总共m条公路。

以下m行每行两个整数a,b,表示城市a和城市b之间修筑了直接的公路。

【输出格式】

输出有若干行。

每行包含两个数字a,b(a是dangerouspavement。

请注意:

输出时,所有的数对必须按照a从小到大排序输出;如果a相同,则根据b从小到大排序。

【输入样例】Danger.in

66

12

23

24

35

45

56

【输出样例】Danger.out

12

56

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1