题意:

给定n个城市, 然后城市之间会有长城相连, 长城之间会围成M个区域, 有L个vip(每个vip会处于一个城市里)要找一个区域聚会, 问一共最少跨越多少个长城。

分析:

其实这题难就难在建图, 因为图中的点不再是城市, 而是城市之间长城围成的区域, 只要把区域提取出来, 这题就是简单的Floyd了。

我们可以把每个区域的边先记录下来, 然后有共边的就是相邻的区域, vip所在的城市都是vip的出发区域,枚举聚会区域,然后都可能的vip区域都求一次取最少值再求和即可。

#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<queue>
#include<set>
#include<map>
#include<stack>
#include<bitset>
#define rep(i,a,b) for(int i = a; i < b; i++)
#define _rep(i,a,b) for(int i = a; i <= b; i++)
#define mem(a,n) memset(a,n,sizeof(a))
#define fre(a) freopen(a,"r", stdin);
typedef long long LL;
using namespace std;
int M, N, L;
const int Max = , Max_v = ;
int viper[Max_v];
int G[Max][Max];
vector<int> city[Max][Max]; // which city have u to v;
vector<int> vip_city[Max];
int close_city[];
int main(){
rep(i,,Max) rep(j,,Max) G[i][j] = (i == j ? : 1e6);
cin >> M >> N >> L;
rep(i,,L){
cin >> viper[i];
}
_rep(i,,M){
int p,k,cnt = ; cin >> k;
int point[Max];
rep(j,,k){
cin >> p;
rep(q,,L) if(p == viper[q]) vip_city[viper[q]].push_back(i); //把vip可能所在的城市加入vip_city point[cnt++] = p;
} rep(j,,cnt){
int u = point[j], v = point[(j+)%cnt];//在环上每两个相邻点就是一条边
city[u][v].push_back(i);
city[v][u].push_back(i);
}
}
_rep(i,,N){
_rep(j,,N){
if(i != j && city[i][j].size() > ){
int cnt = ;
rep(k,,city[i][j].size()){
close_city[cnt++] = city[i][j][k];//如果这条边有多于2个城市, 那么这些城市两两之间都是相邻城市
}
rep(k,,cnt){
rep(l,k+,cnt){
int u = close_city[k], v = close_city[l];
G[u][v] = ;
G[v][u] = ;
}
}
}
}
} for(int k = ; k <= M; k++){
for(int i = ; i <= M; i++){
for(int j = ; j <= M; j++){
if(G[i][k] + G[k][j] < G[i][j]){
G[i][j] = G[i][k] + G[k][j];
}
}
}
}
int ans = 1e9;
_rep(pick, , M){//枚举聚会区域
int t = ;
rep(i,,L){//枚举每个vip的可能区域
int v = viper[i];
int min_dis = 1e6;
rep(j,,vip_city[v].size()) {
int in = vip_city[v][j];
min_dis = min(min_dis, G[in][pick]);
}
t += min_dis;
}
ans = min(t, ans);
}
cout << ans << "\n";
}

POJ 1161 Walls(Floyd , 建图)的更多相关文章

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

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

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

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

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

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

  4. poj 3281 最大流+建图

    很巧妙的思想 转自:http://www.cnblogs.com/kuangbin/archive/2012/08/21/2649850.html 本题能够想到用最大流做,那真的是太绝了.建模的方法很 ...

  5. poj 1161 Walls

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

  6. POJ 1637 Sightseeing tour 建图+网络流

    题意: 给定一个混合图,所谓混合图就是图中既有单向边也有双向边,现在求这样的图是否存在欧拉回路. 分析: 存在欧拉回路的有向图,必须满足[入度==出度],现在,有些边已经被定向,所以我们直接记录度数即 ...

  7. POJ 1149 网络流 合并建图

    这个题目我敲了一个简单的EK,这不是难点 难点在于建图,按题目的要求 每个猪圈和顾客都建点的话,那也太多了...我看了Edelweiss里面的缩点方法才建好的图,哎,惭愧啊 实际那些猪圈根本不需要单独 ...

  8. POJ - 1149 PIGS (建图思维+最大流)

    (点击查看原题) 题目分析 (以下均为 Edelweiss 大佬的思路,博主承认自己写不了这么好,但是学习的心促使我记录下这个好题的写法,所以代码是我写的) [题目大意] 有 M 个猪圈,每个猪圈里初 ...

  9. poj 3281 最大流建图

    题目链接:http://poj.org/problem?id=3281 #include <cstdio> #include <cmath> #include <algo ...

随机推荐

  1. 最短路之Floyd(弗洛伊德)

    只有五行的Floyd最短路算法: 核心代码 每次都更新通过k点,然后从i到j的最短路程...

  2. hdu1879 继续畅通工程 基础最小生成树

    #include <cstdio> #include <cstdlib> #include <algorithm> #include <cmath> u ...

  3. 浅谈算法——FWT(快速沃尔什变换)

    其实FWT我啥都不会,反正就是记一波结论,记住就好-- 具体证明的话,推荐博客:FWT快速沃尔什变换学习笔记 现有一些卷积,形如 \(C_k=\sum\limits_{i\lor j=k}A_i*B_ ...

  4. normal曲线绘制

      <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&q ...

  5. 使用statement接口实现增,删,改操作

  6. H5图片预览功能

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  7. AJPFX总结Collection集合(上)

    出现集合类的原因 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一个方式. 数组和集合都是容器有何不同? 数组虽也可存储对象,但长度 ...

  8. SQL 导出csv

    https://jingyan.baidu.com/album/4b07be3c466b5d48b280f37f.html?picindex=9

  9. C# 获取本机IP(优化项目实际使用版)

    好一段时间没来更新博客了,因为密码实在记不住,烦死了,密码干脆直接用那个找回密码链接的一部分. 吐槽完说正事了,关于C#  获取本机IP的,最开始用的是下面的,但是因为获取IP的有点多,而且难判断,忽 ...

  10. 洛谷 P2788 数学1(math1)- 加减算式

    题目背景 蒟蒻HansBug在数学考场上,挠了无数次的头,可脑子里还是一片空白. 题目描述 好不容易啊,HansBug终于熬到了做到数学最后一题的时刻了,眼前是一堆杂乱的加减算式.显然成功就在眼前了. ...