博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【最短路】Walls
阅读量:5117 次
发布时间:2019-06-13

本文共 5658 字,大约阅读时间需要 18 分钟。

版权声明:本篇随笔版权归作者Etta所有,转载请保留原地址!

Description

  In a country, great walls have been built in such a way that every great wall connects exactly two towns. The great walls do not cross each other. Thus, the country is divided into such regions that to move from one region to another, it is necessary to go through a town or cross a great wall. For any two towns A and B, there is at most one great wall with one end in A and the other in B, and further, it is possible to go from A to B by always walking in a town or along a great wall. The input format implies additional restrictions. 

  There is a club whose members live in the towns. In each town, there is only one member or there are no members at all. The members want to meet in one of the regions (outside of any town). The members travel riding their bicycles. They do not want to enter any towns, because of the traffic, and they want to cross as few great walls as possible, as it is a lot of trouble. To go to the meeting region, each member needs to cross a number (possibly 0) of great walls. They want to find such an optimal region that the sum of these numbers (crossing-sum, for short) is minimized. 

  The towns are labeled with integers from 1 to N, where N is the number of towns. In Figure 1, the labeled nodes represent the towns and the lines connecting the nodes represent the great walls. Suppose that there are three members, who live in towns 3, 6, and 9. Then, an optimal meeting region and respective routes for members are shown in Figure 2. The crossing-sum is 2: the member from town 9 has to cross the great wall between towns 2 and 4, and the member from town 6 has to cross the great wall between towns 4 and 7. 

  You are to write a program which, given the towns, the regions, and the club member home towns, computes the optimal region(s) and the minimal crossing-sum. 

 

Input

Your program is to read from standard input. The first line contains one integer: the number of regions M, 2 <= M <= 200. The second line contains one integer: the number of towns N, 3 <= N <= 250. The third line contains one integer: the number of club members L, 1 <= L <= 30, L <= N. The fourth line contains L distinct integers in increasing order: the labels of the towns where the members live. 

After that the input contains 2M lines so that there is a pair of lines for each region: the first two of the 2M lines describe the first region, the following two the second and so on. Of the pair, the first line shows the number of towns I on the border of that region. The second line of the pair contains I integers: the labels of these I towns in some order in which they can be passed when making a trip clockwise along the border of the region, with the following exception. The last region is the "outside region" surrounding all towns and other regions, and for it the order of the labels corresponds to a trip in counterclockwise direction. The order of the regions gives an integer labeling to the regions: the first region has label 1, the second has label 2, and so on. Note that the input includes all regions formed by the towns and great walls, including the "outside region". 

Output

Your program is to write to standard output. The first line contains one integer: the minimal crossing-sum.

 

Sample Input

10 

10 

3 6 9  

1 2 3  

1 3 7 

2 4 7 3  

4 6 7  

4 8 6  

6 8 7  

4 5 8  

7 8 10 9  

5 10 8  

7 9 10 5 4 2 1

 

Sample Output

2

 

一、分析问题

       乍一看全英文的题面已经要晕,但沉下心来读其实不难。求解的是每个town的人到达同一个region使总共穿过的wall最少。可以把每一个region抽象为一个点,相邻的region间连一条长度为1的边,再上最短路求任意两点间的距离+枚举即可。

 

二、解决问题

       Floyed+枚举

       本题新颖在构图。最开始我没有给每个区域存边,只是把点sort排序之后,两个region若包含两个或以上相同的点就连边。但是在一个region中两个点不一定能连边,所以是不对的。最终改为判断region间是否有相同的边来连边。

       存区域时,最外圈也要存为一个新的区域(即输入最后一行)。

 

三、代码实现

#include
#include
using namespace std;const int MA=210,B=260,inf=4e8;int m,n,w,l,ss,h,t,sum=inf;//m region n town l membersint a[B],s[MA];//w where members liveint g[MA][MA];int k[B][MA],u[MA][B][3],v[B];bool bo;void init(){ scanf("%d%d%d",&m,&n,&l); for(int i=1;i<=l;++i) { scanf("%d",&w); v[++v[0]]=w; } for(int i=1;i<=m;++i) { scanf("%d",&ss);//number of town for(int j=1;j<=ss;++j) { scanf("%d",&a[j]);//the towns surrounding the region k[a[j]][++k[a[j]][0]]=i; if(j!=1) { u[i][++s[i]][0]=a[j-1]; u[i][s[i]][1]=a[j]; } if(j==ss) { u[i][++s[i]][0]=a[j]; u[i][s[i]][1]=a[1]; } } }}void graph(){ for(int i=1;i<=m-1;++i) for(int j=i+1;j<=m;++j) g[i][j]=g[j][i]=inf; for(int i=1;i<=m-1;++i) { for(int j=i+1;j<=m;++j) { bo=0; if(i!=j) for(int f=1;f<=s[i];++f) { for(int z=1;z<=s[j];++z) { if((u[j][z][1]==u[i][f][1]&&u[j][z][0]==u[i][f][0]) ||(u[j][z][1]==u[i][f][0]&&u[j][z][0]==u[i][f][1])) { g[i][j]=g[j][i]=1; bo=1; break; } } if(bo)break; } } }}void floyed(){ for(int q=1;q<=m;++q) for(int i=1;i<=m;++i) for(int j=1;j<=m;++j) if(g[i][j]>g[i][q]+g[q][j]) g[i][j]=g[i][q]+g[q][j];}void enu(){ for(int i=1;i<=m;++i)//枚举区域 { int ans=0; for(int j=1;j<=v[0];++j) { int minn=inf; for(int r=1;r<=k[v[j]][0];++r) if(g[k[v[j]][r]][i]

 

转载于:https://www.cnblogs.com/Etta/p/6357340.html

你可能感兴趣的文章
【iOS越狱开发】如何将应用打包成.ipa文件
查看>>
[NOIP2013提高组] CODEVS 3287 火车运输(MST+LCA)
查看>>
Yii2 Lesson - 03 Forms in Yii
查看>>
Python IO模型
查看>>
Ugly Windows
查看>>
DataGridView的行的字体颜色变化
查看>>
Java再学习——关于ConcurrentHashMap
查看>>
如何处理Win10电脑黑屏后出现代码0xc0000225的错误?
查看>>
局域网内手机访问电脑网站注意几点
查看>>
[Serializable]的应用--注册码的生成,加密和验证
查看>>
Day19内容回顾
查看>>
第七次作业
查看>>
SpringBoot项目打包
查看>>
Linux操作系统 和 Windows操作系统 的区别
查看>>
《QQ欢乐斗地主》山寨版
查看>>
文件流的使用以及序列化和反序列化的方法使用
查看>>
Android-多线程AsyncTask
查看>>
第一个Spring冲刺周期团队进展报告
查看>>
红黑树 c++ 实现
查看>>
Android 获取网络链接类型
查看>>