题意是:

给出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+枚举的更多相关文章

  1. poj1178 floyd+枚举

    http://poj.org/problem?id=1178 Description Centuries ago, King Arthur and the Knights of the Round T ...

  2. POJ 1161 Walls(最短路+枚举)

    POJ 1161 Walls(最短路+枚举) 题目背景 题目大意:题意是说有 n个小镇,他们两两之间可能存在一些墙(不是每两个都有),把整个二维平面分成多个区域,当然这些区域都是一些封闭的多边形(除了 ...

  3. poj 1873 凸包+枚举

    The Fortified Forest Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 6198   Accepted: 1 ...

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

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

  5. POJ 1161 Walls(Floyd , 建图)

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

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

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

  7. Floyd 求最短路(poj 1161)

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

  8. poj 1125 (floyd)

    http://poj.org/problem?id=1125. 题意:在经纪人的圈子里,他们各自都有自己的消息来源,并且也只相信自己的消息来源,他们之间的信息传输也需要一定的时间.现在有一个消息需要传 ...

  9. poj 3311(floyd+状态压缩)

    题目链接:http://poj.org/problem?id=3311 思路:Floyd + 状态压缩DP  题意是有N个城市(1~N)和一个PIZZA店(0),要求一条回路,从0出发,又回到0,而且 ...

随机推荐

  1. C#:winform项目在win7,xp32位和64位都能运行

    vs中项目配置管理器活动解决方案平台选择X86平台.

  2. OpenCV视频进度播放控制

    本来打算把进度条嵌入MFC的PIC空间里面,结果显示进度条消失,看来还是不要这个样子了. 全局变量区域: //2.初始化进度条的位置 int G_slider_position = 0; CvCapt ...

  3. webapi部署到IIS 404错误

    环境:win2008r2+IIS 解决方案: 添加一个映射 可执行文件地址(根据系统决定64位可32位): C:\Windows\Microsoft.NET\Framework64\v4.0.3031 ...

  4. 在 Laravel 应用中使用 pjax 进行页面加速

    说明# PHPHub 使用 pjax 来加速网页的加载, 这篇文章是在开发完此功能后做的笔记. 什么是 Pjax# .--. / \ ## a a ( '._) |'-- | _.\___/_ ___ ...

  5. https 认证总结

    https 握手阶段 服务器会下发一个证书链: 客户端默认的处理是使用系统的根证书对这个证书链进行合法性认证: 自签名证书,则需要自己完成证书链认证: 其他附属信息认证: 说白了就是一个数据检查的过程 ...

  6. Java通过接口实现匿名类的实例

    package com.chase.test; /** * 通过接口实现匿名类的实例 * * @author Chase * * @date 2013-10-18 下午04:28:17 * * @ve ...

  7. Android 性能测试初探(三)

    书接上文 Android 性能测试初探(二) 本文接着往下聊,今天主聊 CPU 及 内存 看到这两个名词,做过PC性能测试的就比较熟悉了,同样的性能测试关注点 :) 首先说说内存,移动端关注的是内存消 ...

  8. Restrictions.like("字段field","%表达式exp%");

    Restrictions.like("字段field","%表达式exp%");用hql语句就是 from table where field like '%e ...

  9. vue-router 懒加载

    懒加载:也叫延迟加载,即在需要的时候进行加载,按需加载. 那vue 为什么需要懒加载呢? 使用 vue-cli构建的项目,在默认情况下,执行 npm run build  会将所有的 js代码打包为一 ...

  10. OSX: 安装打印机的有用命令行

    事实上非常easy.就是有用lpadmin命令,以下给出一个样例: printername="YOUR_PRINTER_NAME" location="LOCATION ...