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

题目链接:http://poj.org/problem?id=1161

题目大意:

1.给出m个区域,n个俱乐部点。接下来是n个俱乐部点以及各个区域由什么点围成。求一个区域到各个俱乐部点的距离之和最小。

解题思路:

1.这题建图比较麻烦,以区域为点建图,区域之间若有边,则两区域的距离为1,建完图后跑一遍floyd就可以求出两两区域的最小距离。

2.对于答案,枚举每一个区域到各个俱乐部点的相邻区域的距离之和,取最小值。

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 #define mem(a, b) memset(a, b, sizeof(a))
 5 using namespace std;
 6 const int inf = 0x3f3f3f3f;
 7
 8 int m, n, l;
 9 int club[35], vis[260][210];//标记i点是否与j区域相邻
10 int edge[260][260]; //更新i到j边的相邻区域是哪个
11 int map[260][260]; //建图
12
13 void floyd()
14 {
15     for(int i = 1; i <= m; i ++)
16         map[i][i] = 0;
17     for(int k = 1; k <= m; k ++)
18         for(int i = 1; i <= m; i ++)
19             for(int j = 1; j <= m; j ++)
20                 map[i][j] = map[j][i] = min(map[i][j], map[i][k] + map[k][j]);
21 }
22
23 int main()
24 {
25     while(scanf("%d", &m) != EOF) //m个区域
26     {
27         mem(edge, -1); //表示没有相邻区域
28         mem(map, inf), mem(vis, -1);
29         scanf("%d%d", &n, &l);//n个点,其中l个点是俱乐部所在的点
30         for(int i = 1; i <= l; i ++)
31             scanf("%d", &club[i]);
32         for(int i = 1; i <= m; i ++)
33         {
34             int k, temp;
35             scanf("%d", &k); //每个区域由k个点逆时针围成 注意最后一个点与第一个点也有边
36             scanf("%d", &temp);
37             vis[temp][i] = 1;
38             int first = temp;
39             for(int j = 1; j < k; j ++)
40             {
41                 int x;
42                 scanf("%d", &x);
43                 vis[x][i] = 1;
44                 if(edge[temp][x] == -1 || edge[x][temp] == -1)
45                     edge[temp][x] = edge[x][temp] = i;
46                 else
47                 {
48                     map[edge[temp][x]][i] = map[i][edge[temp][x]] = 1;
49                     edge[temp][x] = edge[x][temp] = i;
50                 }
51                 temp = x;
52             }
53             if(edge[first][temp] == -1 || edge[temp][first] == -1)
54                 edge[first][temp] = edge[temp][first] = i;
55             else
56             {
57                 map[edge[first][temp]][i] = map[i][edge[first][temp]] = 1;
58                 edge[first][temp] = edge[temp][first] = i;
59             }
60         }
61         floyd();
62         int ans = inf;
63         for(int i = 1; i <= m; i ++) //枚举答案 枚举每一个区域
64         {
65             int temp = 0;
66             for(int j = 1; j <= l; j ++)
67             {
68                 int temp1 = inf;
69                 for(int k = 1; k <= m; k ++)
70                 {
71                     if(vis[club[j]][k] == -1)
72                         continue;
73                     temp1 = min(temp1, map[i][k]);
74                 }
75                 temp += temp1;
76             }
77             ans = min(ans, temp);
78         }
79         printf("%d\n", ans);
80     }
81     return 0;
82 }

原文地址:https://www.cnblogs.com/yuanweidao/p/11650181.html

时间: 2024-10-08 21:51:20

POJ 1161 Walls【floyd 以面为点建图】的相关文章

POJ 1161 Walls ( Floyd &amp;&amp; 建图 )

题意 :  在某国,城市之间建起了长城,每一条长城连接两座城市.每条长城互不相交.因此,从一个区域到另一个区域,需要经过一些城镇或者穿过一些长城.任意两个城市A和B之间最多只有一条长城,一端在A城市,另一端在B城市.从A走到B,可以只在一个区域内行走,或者只在长城上行走. 有一个俱乐部,它的会员分布在不同的城市中,每个城市要么只有一个会员,要么没有会员.会员们决定要集中到一个区域内聚会.他们骑车前往目的地.首先,由于城市内交通太堵,他们不想进入任何一个城市内,其次,他们希望穿越尽可能少的长城.他

POJ 1161 Walls(最短路+枚举)

POJ 1161 Walls(最短路+枚举) 题目背景 题目大意:题意是说有 n个小镇,他们两两之间可能存在一些墙(不是每两个都有),把整个二维平面分成多个区域,当然这些区域都是一些封闭的多边形(除了最外面的一个),现在,如果某几个小镇上的人想要聚会,为选择哪个区域为聚会地点,可以使他们所有人总共需要穿过的墙数最小,题目上有说明,不在某个点上聚会(聚会点在某个多边形内部),行进过程中不穿过图中的点(也就是除出发点外的其他小镇). 输入第1行代表m(2<=M<=200)个区域 第2行代表n(3&

POJ 1436 Horizontally Visible Segments(线段树建图+枚举)

题目连接:http://poj.org/problem?id=1436 题意:给一些线段,每个线段有三个值y1, y2, x代表起点为(x, y1),终点为(x, y2)的线段.当从一个线段可以作水平线到另一个线段并且不穿过其他线段时,就称这两个线段时水平可见的.当三个线段可以两两水平可见,就称为形成一个线段三角.问:在这些线段中有多少个这样的线段三角? 分析:可以把每条线段看做是一个点,如果它和其他线段是水平可见的,就将这两个点相连,由于是无向图,就是你能看到我,我也能看到你,所以需要连接两次

poj 1161 Walls

https://vjudge.net/problem/POJ-1161 题意:有m个区域,n个小镇,有c个人在这些小镇中,他们要去某一个区域中聚会,从一个区域到另一个区域需要穿墙,问这些人聚到一起最少需要穿过几道墙.题中给出的区域是用小镇描述的,某几个小镇围成一个区域,每一个区域按照顺时针方向给出的.思路:首先用两个vector,一个描述一个区域,属性是这个区域的边界有哪些点,另一个描述一个点,属性是这些点属于哪个区域.然后接下来,我们把每一个区域看成一个点,开始建图.这题的难点就在于怎么建图,

POJ 3281 Dining (网络流最大流 拆点建图 Edmonds-Karp算法)

Dining Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10159   Accepted: 4676 Description Cows are such finicky eaters. Each cow has a preference for certain foods and drinks, and she will consume no others. Farmer John has cooked fabulo

POJ 1161 Walls(Floyd , 建图)

题意: 给定n个城市, 然后城市之间会有长城相连, 长城之间会围成M个区域, 有L个vip(每个vip会处于一个城市里)要找一个区域聚会, 问一共最少跨越多少个长城. 分析: 其实这题难就难在建图, 因为图中的点不再是城市, 而是城市之间长城围成的区域, 只要把区域提取出来, 这题就是简单的Floyd了. 我们可以把每个区域的边先记录下来, 然后有共边的就是相邻的区域, vip所在的城市都是vip的出发区域,枚举聚会区域,然后都可能的vip区域都求一次取最少值再求和即可. #include<io

HDU 1535 &amp;&amp; POJ 1511 Invitation Cards (SPFA 模板 + 反向建图)

Invitation Cards HDU: Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) POJ: Time Limit: 8000 MS     Memory Limit: 262144 K       Problem Description In the age of television, not many people attend theater performa

POJ 2226-Muddy Fields(二分图_最小点覆盖+神建图orz)

Muddy Fields Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8434   Accepted: 3124 Description Rain has pummeled the cows' field, a rectangular grid of R rows and C columns (1 <= R <= 50, 1 <= C <= 50). While good for the grass, t

POJ 2239-Selecting Courses(二分图_最大匹配+哈希建图)

Selecting Courses Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8781   Accepted: 3922 Description It is well known that it is not easy to select courses in the college, for there is usually conflict among the time of the courses. Li Mi