Walls
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 7677   Accepted: 3719

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
3 6 9
3
1 2 3
3
1 3 7
4
2 4 7 3
3
4 6 7
3
4 8 6
3
6 8 7
3
4 5 8
4
7 8 10 9
3
5 10 8
7
7 9 10 5 4 2 1

Sample Output

2

Source

IOI 2000

以每一个区域为点建立图,然后暴力搜索最小的区域

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm> using namespace std; const int INF = 0x3f3f3f3f; int m,n,L;
int man[300];//成员
int Area[250][300];//区域
int Dis[250][250];//区域之间的距离
int dis[40];//人到某个区域的距离
void floyd()//计算区域的最短路
{
for(int k=1;k<=m;k++)
{
for(int i=1;i<=m;i++)
{
for(int j=1;j<=m;j++)
{
if(Dis[i][j]>Dis[i][k]+Dis[k][j])
{
Dis[i][j]=Dis[i][k]+Dis[k][j];
}
}
}
}
} int solve()//暴力枚举区域找最小的值
{
int Min=INF;
for(int i=1;i<=m;i++)
{
for(int j=1;j<=L;j++)
{
dis[j]=INF;
}
for(int j=1;j<=m;j++)
{
for(int k=1;k<=Area[j][0];k++)
{
if(man[Area[j][k]]>0&&dis[man[Area[j][k]]]>Dis[i][j])
{
dis[man[Area[j][k]]]=Dis[i][j];
}
}
}
int temp=0;
for(int j=1;j<=L;j++)
{
temp+=dis[j];
}
Min=min(Min,temp);
}
return Min;
}
int main()
{
int a;
while(~scanf("%d",&m))
{
scanf("%d %d",&n,&L);
memset(man,0,sizeof(man));
for(int i=1; i<=L; i++)
{
scanf("%d",&a);
man[a]=i;//在那个点住着的成员编号
}
for(int i=1;i<=m;i++)//初始化
{
for(int j=i;j<=m;j++)
{
if(i==j)
{
Dis[i][j]=0;
}
else
{
Dis[i][j]=Dis[j][i]=INF;
}
}
}
for(int i=1; i<=m; i++)
{
scanf("%d",&Area[i][0]);
for(int j=1; j<=Area[i][0]; j++)
{
scanf("%d",&Area[i][j]);//区域的点集,逆时针方向
}
Area[i][Area[i][0]+1]=Area[i][1];//闭合区域
for(int j=1; j<=Area[i][0]; j++)//判断区域是不是相邻
{
for(int k=1; k<i; k++)
{
for(int s=1; s<=Area[k][0]; s++)
{
if(Area[i][j+1]==Area[k][s]&&Area[i][j]==Area[k][s+1])//判断区域是不是邻接
{
Dis[i][k]=Dis[k][i]=1;
}
}
}
}
}
floyd();
printf("%d\n",solve());
}
return 0;
}

Walls(floyd POJ1161)的更多相关文章

  1. POJ 1161 Walls ( Floyd && 建图 )

    题意 :  在某国,城市之间建起了长城,每一条长城连接两座城市.每条长城互不相交.因此,从一个区域到另一个区域,需要经过一些城镇或者穿过一些长城.任意两个城市A和B之间最多只有一条长城,一端在A城市, ...

  2. 图论常用算法之一 POJ图论题集【转载】

    POJ图论分类[转] 一个很不错的图论分类,非常感谢原版的作者!!!在这里分享给大家,爱好图论的ACMer不寂寞了... (很抱歉没有找到此题集整理的原创作者,感谢知情的朋友给个原创链接) POJ:h ...

  3. POJ 1161 Walls(Floyd , 建图)

    题意: 给定n个城市, 然后城市之间会有长城相连, 长城之间会围成M个区域, 有L个vip(每个vip会处于一个城市里)要找一个区域聚会, 问一共最少跨越多少个长城. 分析: 其实这题难就难在建图, ...

  4. POJ 1161 Walls【floyd 以面为点建图】

    题目链接:http://poj.org/problem?id=1161 题目大意: 1.给出m个区域,n个俱乐部点.接下来是n个俱乐部点以及各个区域由什么点围成.求一个区域到各个俱乐部点的距离之和最小 ...

  5. Floyd 求最短路(poj 1161)

    Floyd-Warshall算法介绍: Floyd-Warshall算法的原理是动态规划. 设为从到的只以集合中的节点为中间节点的最短路径的长度. 若最短路径经过点k,则: 若最短路径不经过点k,则. ...

  6. poj 1161 Walls

    https://vjudge.net/problem/POJ-1161 题意:有m个区域,n个小镇,有c个人在这些小镇中,他们要去某一个区域中聚会,从一个区域到另一个区域需要穿墙,问这些人聚到一起最少 ...

  7. floyd算法学习笔记

    算法思路 路径矩阵 通过一个图的权值矩阵求出它的每两点间的最短路径矩阵.从图的带权邻接矩阵A=[a(i,j)] n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按一个公式,构造出矩阵D(1):又 ...

  8. 最短路(Floyd)

    关于最短的先记下了 Floyd算法: 1.比较精简准确的关于Floyd思想的表达:从任意节点A到任意节点B的最短路径不外乎2种可能,1是直接从A到B,2是从A经过若干个节点X到B.所以,我们假设maz ...

  9. 最短路径之Floyd算法

    Floyd算法又称弗洛伊德算法,也叫做Floyd's algorithm,Roy–Warshall algorithm,Roy–Floyd algorithm, WFI algorithm. Floy ...

随机推荐

  1. C#,.Net自动生成大写字母编码

    public static string GetChineseSpell(string strText)        {            int len = strText.Length;   ...

  2. Oracle登录操作系统验证和密码文件验证

    1.确认数据库版本 2.查看当前配置文件 ORALCE数据库不同的登录验证方式是和SQLNET.ORA配置文件有关系的,在配置文件中有一个参数sqlnet.authentication_service ...

  3. jsp&Sevelet基础详解

    1.用scriptlet标签在jsp中嵌入java代码: (1).<%!...%>可以在里面定义全局变量,方法,类,一般写在<head>内 (2).<%%>定义的是 ...

  4. demo工程的清单文件及activity中api代码简单示例

    第一步注册一个账户,并创建一个应用.获取app ID与 app Key. 第二步下载sdk 第三步新建工程,修改清单文件,导入相关的sdk文件及调用相应的api搞定. 3.1 修改清单文件,主要是加入 ...

  5. window下从python开始安装科学计算环境

    Numpy等Python科学计算包的安装与配置 参考: 1.下载并安装 http://www.jb51.net/article/61810.htm 1.安装easy_install,就是为了我们安装第 ...

  6. 关于webapi post 使用多个参数的间接用法

    问题描述: Web Api 当使用Post提交的时候 由于只能接受一个参数 ,所以我们基本都会选择把所需要的参数,进行封装实体. 有的时候所需要的信息在其他两个实体中,还需要重新封装也不爽. 今天发现 ...

  7. ansible使用笔记

    ansible使用笔记 介绍 ansible 是一个模型驱动的配置管理器,支持多节点发布.远程任务执行.默认使用 SSH 进行远程连接.无需在被管理节点上安装附加软件,可使用各种编程语言进行扩展.an ...

  8. k8s入门系列之扩展组件(一)DNS安装篇

    DNS (domain name system),提供域名解析服务,解决了难于记忆的IP地址问题,以更人性可读可记忆可标识的方式映射对应IP地址. Cluster DNS扩展插件用于支持k8s集群系统 ...

  9. erlang httpc

    1,set proxy 10.100.1.76 :8888 httpc:set_options([{proxy,{{"10.100.1.76",8888},[]}}]). 2,se ...

  10. c#:排序

    http://www.cnblogs.com/end/archive/2011/10/22/2220940.html 选择排序 冒泡排序 快速排序 插入排序 希尔排序 归并排序 基数排序 计数排序 小 ...