poj 1161 Floyd+枚举
题意是:
给出n个点,围成m个区域。从区域到另一个区域间需穿过至少一条边(若两区域相邻)——边连接着两点。
给出这么一幅图,并给出一些点,问从这些点到同一个区域的穿过边数最小值。
解题思路如下:
将区域按1~m编号,d[i][j]表示第 i 个区域到第 j 个区域的最短距离,跑一遍Floye算法O(m^3)后,枚举选择的区域,找出其中穿过边数最小值即可。
建图:题目对于每个区域的描述方式为以顺时针方向给出围成区域的点。由此可知区域由哪些边组成。易知,每条边能且只能令两个区域相邻,则用二维数组记录当前边结点所围成的区域编号,如vis[i][j]表示结点 i 和结点 j 的之间的边参与围成的区域编号。开始时memset(vis ,0,sizeof(vis)); 若是0,则将其赋值为区域编号;否则得到了相邻区域的编号,赋值d[i][vis[u][v]]=1,则初始化完成。
注意给vis数组赋值时需要vis[i][j]=vis[j][i]=区域编号。
枚举时,因为是计算从某些点到同一区域的最小距离和,而d[][]记录的是区域与区域之间的和,因此以下两点:
1. 对d[i][i]必须赋值为0,这题会用到
2. 为了方便枚举,用belong数组来记录所有点所属的区域。因此求该点到某一区域的最小距离转化成了求该点所有所属区域中到某一区域的最小距离,直接d[i][j]即可。
代码如下
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
#define inf 1<<29
int n,m,l,num,town,d[][],club[],vis[][];
vector<int> region[],belong[];
void Floyd(){
for(int k=;k<=m;k++)
for(int i=;i<=m;i++)
for(int j=;j<=m;j++) if(i!=j)
d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
}
void ini(){
for(int i=;i<=n;i++){
belong[i].clear();
for(int j=;j<=n;j++){
if(i==j) d[i][j]=;
else d[i][j]=inf;
}
}
memset(vis,,sizeof(vis));
for(int i=;i<=m;i++)
region[i].clear();
}
int main(){
//freopen("in.txt","r",stdin);
while(~scanf("%d%d",&m,&n)){
ini();
scanf("%d",&l);
for(int i=;i<l;i++)
scanf("%d",&club[i]);
for(int i=;i<=m;i++){
scanf("%d",&num);
for(int j=;j<num;j++){
scanf("%d",&town);
belong[town].push_back(i);
region[i].push_back(town);
}
region[i].push_back(region[i][]);
for(int j=;j<num;j++){//有公共边即为相邻,赋值1
int u=region[i][j],v=region[i][j+];
if(vis[u][v]) d[vis[u][v]][i]=d[i][vis[u][v]]=;
else vis[u][v]=vis[v][u]=i;
}
}
Floyd();
int dis,ans=inf;
for(int i=;i<=m;i++){
dis=;
for(int j=;j<l;j++){
int tmp=inf,c=club[j];
for(int k=;k<belong[c].size();k++)
tmp=min(tmp,d[i][belong[c][k]]);
dis+=tmp;
}
ans=min(ans,dis);
}
printf("%d\n",ans);
}
return ;
}
M20D%EI%`CZ`5ZMUP7.png)
poj 1161 Floyd+枚举的更多相关文章
- poj1178 floyd+枚举
http://poj.org/problem?id=1178 Description Centuries ago, King Arthur and the Knights of the Round T ...
- POJ 1161 Walls(最短路+枚举)
POJ 1161 Walls(最短路+枚举) 题目背景 题目大意:题意是说有 n个小镇,他们两两之间可能存在一些墙(不是每两个都有),把整个二维平面分成多个区域,当然这些区域都是一些封闭的多边形(除了 ...
- poj 1873 凸包+枚举
The Fortified Forest Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 6198 Accepted: 1 ...
- POJ 1161 Walls【floyd 以面为点建图】
题目链接:http://poj.org/problem?id=1161 题目大意: 1.给出m个区域,n个俱乐部点.接下来是n个俱乐部点以及各个区域由什么点围成.求一个区域到各个俱乐部点的距离之和最小 ...
- POJ 1161 Walls(Floyd , 建图)
题意: 给定n个城市, 然后城市之间会有长城相连, 长城之间会围成M个区域, 有L个vip(每个vip会处于一个城市里)要找一个区域聚会, 问一共最少跨越多少个长城. 分析: 其实这题难就难在建图, ...
- POJ 1161 Walls ( Floyd && 建图 )
题意 : 在某国,城市之间建起了长城,每一条长城连接两座城市.每条长城互不相交.因此,从一个区域到另一个区域,需要经过一些城镇或者穿过一些长城.任意两个城市A和B之间最多只有一条长城,一端在A城市, ...
- Floyd 求最短路(poj 1161)
Floyd-Warshall算法介绍: Floyd-Warshall算法的原理是动态规划. 设为从到的只以集合中的节点为中间节点的最短路径的长度. 若最短路径经过点k,则: 若最短路径不经过点k,则. ...
- poj 1125 (floyd)
http://poj.org/problem?id=1125. 题意:在经纪人的圈子里,他们各自都有自己的消息来源,并且也只相信自己的消息来源,他们之间的信息传输也需要一定的时间.现在有一个消息需要传 ...
- poj 3311(floyd+状态压缩)
题目链接:http://poj.org/problem?id=3311 思路:Floyd + 状态压缩DP 题意是有N个城市(1~N)和一个PIZZA店(0),要求一条回路,从0出发,又回到0,而且 ...
随机推荐
- SSDB 一个高性能的支持丰富数据结构的 NoSQL 数据库, 用于替代 Redis.
SSDB 一个高性能的支持丰富数据结构的 NoSQL 数据库, 用于替代 Redis. 特性 替代 Redis 数据库, Redis 的 100 倍容量 LevelDB 网络支持, 使用 C/C++ ...
- Windows上架设自己的ssh代理 — copSSH
最近网上对ssh代理讨论的比较多, 主要是为了穿墙. 其实在自己的电脑上也可以架设ssh代理, 当然国内自己架的不具有FQ功能, 如果你有国外朋友或是远程win服务器…则可以用此方法架设私有代理. 其 ...
- 【转载】java读取.properties配置文件的几种方法
读取.properties配置文件在实际的开发中使用的很多,总结了一下,有以下几种方法(仅仅是我知道的):一.通过jdk提供的java.util.Properties类.此类继承自java.util. ...
- Mark Zuckberg: A letter to our daughter
转自: http://www.fastcompany.com/3054120/fast-feed/read-mark-zuckerbergs-letter-to-his-newborn-daugh ...
- Oracle开发常用函数 max 最大数 自动加 1
max 最大数 自动加 1 create or replace function fun_getmaxlot( vend in varchar2 , domain IN VARCHAR2, tag i ...
- 洛谷P1426 小鱼会有危险吗【水题模拟】
有一次,小鱼要从A处沿直线往右边游,小鱼第一秒可以游7米,从第二秒开始每秒游的距离只有前一秒的98%.有个极其邪恶的猎人在距离A处右边s米的地方,安装了一个隐蔽的探测器,探测器左右x米之内是探测范围. ...
- 使用pandas中的raad_html函数爬取TOP500超级计算机表格数据并保存到csv文件和mysql数据库中
参考链接:https://www.makcyun.top/web_scraping_withpython2.html #!/usr/bin/env python # -*- coding: utf-8 ...
- 继续聊WPF——Expander控件(1)
这个控件最实用的地方,就是做导航栏. <StackPanel Margin="20,20" Width="100" Height="460&qu ...
- Leetcode 887 Super Egg Drop(扔鸡蛋) DP
这是经典的扔鸡蛋的题目. 同事说以前在uva上见过,不过是扔气球.题意如下: 题意: 你有K个鸡蛋,在一栋N层高的建筑上,被要求测试鸡蛋最少在哪一层正好被摔坏. 你只能用没摔坏的鸡蛋测试.如果一个鸡蛋 ...
- Eureka 服务的注册和发现
二.Eureka 服务端 1.新建一个 maven module 子项目 microservicecloud-eureka-server 2.pom.xml <project xmlns=&qu ...