热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

POJ1815Friendship(最小点割集)

(点击此处查看原题)题目分析题意:有n个人,编号记为1~n,n个人之间可能有人可以互相联系,如果

(点击此处查看原题)

题目分析

题意:有n个人,编号记为1~n,n个人之间可能有人可以互相联系,如果A能和B联系,那么至少满足这两种情况之一:(1)A知道B的电话(2)A可以和C联系,并且C可以和B联系;

因为某些人可能会丢失他的手机,导致他失去所有人的号码以及其他人手机中他的号码,也就是说这个人无法和任何人联系了;

此时给出两个人s,t,问至少有多少人失去他们的手机,可以使得这两个人s,t无法联系。

答案输出最少需要的人数以及失去手机的人的编号,如果存在多组解,输出字典序小的那一组。

 

思路:平时写的最小割问题是求边割集,这个题题目求的是最小点割集,对于这类题目我们采用如下建边方法:

1)将每个人代表的结点拆成两个结点,记编号1~n为入点,n+1~2*n为出点,由入点向出点建一条容量为1的边

2)对于可以联系的两人 a,b,由a的出点向b的入点建一条容量为inf的边,并由b的出点向a的入点建一条容量为inf的边

3)由于源点就是某个人,那么我们将这个人的出点当作源点

建好边之后,我们跑一遍最大流(最小割)就可以得到最小点割集

个人认为这个题主要麻烦在输出割点,我的方法是不断地的删点,如果删去这一点后得到的最大流大于删这点之前的最大流,那么这个点就是割点,为保证字典序最小,因而从1开始枚举割点

代码区

#include
#include

#include

#include

#include

#include
<string>
#include

#include

#include

#include

#include
#define bug cout <<"**********" <#define show(x, y) cout<<"["<#define LOCAL &#61; 1;
using namespace std;
typedef
long long ll;
const int inf &#61; 0x3f3f3f3f;
const ll mod &#61; 998244353;
const int Max &#61; 1e5 &#43; 10;
const int Max2 &#61; 1e3 &#43; 10;struct Edge
{
int to, flow, next;
} edge[Max
<<1];int n, s, t;
int head[Max2], tot;
int dis[Max2];
bool vis[210][210], cancel[210];
int id[Max2], cnt;void init()
{memset(head,
-1, sizeof(head));tot &#61; 0;
}
void add(int u, int v, int flow)
{edge[tot].to
&#61; v;edge[tot].flow &#61; flow;edge[tot].next &#61; head[u];head[u] &#61; tot&#43;&#43;;
}
void build()
{init();
for (int i &#61; 1; i <&#61; n; i&#43;&#43;){if (!cancel[i]){add(i, i &#43; n, 1);add(i &#43; n, i, 0);}}for (int i &#61; 1; i <&#61; n; i&#43;&#43;){for (int j &#61; 1; j <&#61; n; j&#43;&#43;){if(vis[i][j]){add(i &#43; n, j, inf);add(j, i &#43; n, 0);}}}
}
bool bfs()
{memset(dis,
-1, sizeof(dis));queue<int> q;q.push(s);dis[s] &#61; 0;while (!q.empty()){int u &#61; q.front();q.pop();for (int i &#61; head[u]; i !&#61; -1; i &#61; edge[i].next){int v &#61; edge[i].to;if (edge[i].flow > 0 && dis[v] &#61;&#61; -1){dis[v] &#61; dis[u] &#43; 1;if (v &#61;&#61; t)return true;q.push(v);}}}return false;
}
int dfs(int u, int flow_in)
{
if (u &#61;&#61; t)return flow_in;int flow_out &#61; 0;for (int i &#61; head[u]; i !&#61; -1; i &#61; edge[i].next){int v &#61; edge[i].to;if (edge[i].flow > 0 && dis[v] &#61;&#61; dis[u] &#43; 1){int flow &#61; dfs(v, min(flow_in, edge[i].flow));if (flow &#61;&#61; 0)continue;flow_in -&#61; flow;flow_out &#43;&#61; flow;edge[i].flow -&#61; flow;edge[i ^ 1].flow &#43;&#61; flow;if (flow_in &#61;&#61; 0)break;}}return flow_out;
}
int Dinic()
{
int sum &#61; 0;while (bfs()){sum &#43;&#61; dfs(s, inf);}return sum;
}
int main()
{
#ifdef LOCAL
//freopen("input.txt", "r", stdin);//freopen("output.txt", "w", stdout);
#endifwhile (scanf("%d%d%d", &n, &s, &t) !&#61; EOF){memset(cancel, 0, sizeof(cancel));memset(vis, 0, sizeof(vis));cnt &#61; 0;for (int i &#61; 1; i <&#61; n; i&#43;&#43;){for (int j &#61; 1,x; j <&#61; n; j&#43;&#43;){scanf("%d", &x);vis[i][j] &#61; x;}}if(vis[s][t]) //s,t可以直接联系&#xff0c;那就不存在最小割了
{printf("NO ANSWER!\n");continue;}s &#43;&#61; n;build();int min_cost &#61; Dinic();printf("%d\n", min_cost);if (min_cost &#61;&#61; 0)continue;int last &#61; min_cost;for (int i &#61; 1; i <&#61; n; i&#43;&#43;){if (i &#43; n &#61;&#61; s || i &#61;&#61; t)continue;cancel[i] &#61; true;build();int temp &#61; Dinic();if (temp //相比于不删除i点&#xff0c;删除i点之后最大流减少&#xff0c;则此点为割点
{id[&#43;&#43;cnt] &#61; i;last--;if (cnt &#61;&#61; min_cost)break;}else{cancel[i] &#61; false;}}for (int i &#61; 1; i )printf("%d ", id[i]);printf("%d\n", id[cnt]);}return 0;
}

View Code

转:https://www.cnblogs.com/winter-bamboo/p/11384939.html



推荐阅读
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • ***byte(字节)根据长度转成kb(千字节)和mb(兆字节)**parambytes*return*publicstaticStringbytes2kb(longbytes){ ... [详细]
  • 本文介绍了Codeforces Round #321 (Div. 2)比赛中的问题Kefa and Dishes,通过状压和spfa算法解决了这个问题。给定一个有向图,求在不超过m步的情况下,能获得的最大权值和。点不能重复走。文章详细介绍了问题的题意、解题思路和代码实现。 ... [详细]
author-avatar
手机用户2502930273
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有