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 ;
}
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,而且 ...
随机推荐
- Java_Web之Servlet基础
请简要描述EL表达式的语法及使用特点? ${ EL exprission } ${ bean.name } 或 ${ bean['name'] } 请简要描述什么是JSTL? JSP标准标签库 ...
- centos开机运行级别更改
1.使用命令切换运行级别/目标 # systemctl isolate multi-user.target //切换到运行级别3,该命令对下次启动无影响,等价于telinit 3 # systemct ...
- dubbo之静态服务
有时候希望人工管理服务提供者的上线和下线,此时需将注册中心标识为非动态管理模式 <dubbo:registry address="10.20.141.150:9090" dy ...
- 推荐系统入门:作为Rank系统的推荐系统(协同过滤)
知乎:如何学习推荐系统? 知乎:协同过滤和基于内容的推荐有什么区别? 案例:推荐系统实战? 数据准备:实现推荐栏位:重构接口:后续优化. 简书:实现实时推荐系统的三种方式?基于聚类和协同过滤:基于S ...
- 【sqli-labs】 less27 GET- Error based -All you Union&Select Belong to us -String -Single quote(GET型基于错误的去除了Union和Select的单引号字符型注入)
看一下过滤函数 看一下/s是什么东西 那直接通过大小写就可以绕过了 http://192.168.136.128/sqli-labs-master/Less-27/?id=0'%a0uNion%a0s ...
- c# 读取 XML
XmlDocument xmldoc = new XmlDocument(); string xmlPath = HttpContext.Server.MapPath("~/*****.xm ...
- Laravel -- windows apache .htaccess https 路由重写
一: <IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{SERVER_PORT} !^443 RewriteCond %{RE ...
- js俄罗斯方块
<html> <style>.c {margin :1px;width:19px;height:19px;background:red;position:absolute;} ...
- luoguP1725 琪露诺 单调队列
DP 方程:$f[i]=max(f[j])+v[i]$ 转移范围:$i-r<=j<=i-l$ 由此我们得知,每次只有 $[i-r,i-l]$ 部分的 $f$ 值对新更新的答案会有贡献. 故 ...
- C# 发起Get和Post请求
public class ApiHelper { //contentType application/json or application/xml public string HttpGet(str ...