The King’s Problem 强连通
题意 有n个城市 m条有向边
将n个城市分成几个州
1.强连通必定在一个州里
2.州里的任意两个城市 u,v 满足u到v 或者v到u 其一即可
先缩点 然后求最小路就覆盖
#include<bits/stdc++.h> #include<iostream> #include<cstring> #include<cstdio> using namespace std; //input by bxd #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define repp(i,a,b) for(int i=(a);i>=(b);--i) #define RI(n) scanf("%d",&(n)) #define RII(n,m) scanf("%d%d",&n,&m) #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) #define RS(s) scanf("%s",s); #define ll long long #define pb push_back #define REP(i,N) for(int i=0;i<(N);i++) #define CLR(A,v) memset(A,v,sizeof A) // #define inf 0x3f3f3f3f const int N=5000+5; int head[20*N],pos; struct Edge {int to,nex; }edge[20*N]; void add(int a,int b) {edge[++pos].nex=head[a];head[a]=pos;edge[pos].to=b; } int low[N],dfn[N],inde,Stack[N],vis[N],tot,cnt,belong[N],out[N];vector<int>G[N]; int used[N]; void init() {CLR(dfn,0);CLR(vis,0);CLR(low,0);CLR(out,0);pos=inde=tot=cnt=0;CLR(head,0);} void tarjan(int x) {dfn[x]=low[x]=++tot;Stack[++inde]=x;vis[x]=1;for(int i=head[x];i;i=edge[i].nex){int v=edge[i].to;if(!dfn[v]){tarjan(v);low[x]=min(low[x],low[v]);}else if(vis[v])low[x]=min(low[x],low[v]);}if(dfn[x]==low[x]){cnt++;int v;do{v=Stack[inde--];vis[v]=0;belong[v]=cnt;}while(v!=x);} }bool dfs(int x) {if(G[x].size())rep(j,0,G[x].size()-1){int t=G[x][j];if(!used[t]){used[t]=1;if(!vis[t]||dfs(vis[t])){vis[t]=x;return true;}}}return false; }int find1(void ) {int ans=0;CLR(vis,0);rep(i,1,cnt){CLR(used,0);if(dfs(i))ans++;}return ans; }int main() {int cas;RI(cas);while(cas--){int n,m;RII(n,m);rep(i,1,m){int a,b;RII(a,b);add(a,b);}rep(i,1,n)if(!dfn[i])tarjan(i);rep(i,1,n){int u=belong[i];for(int j=head[i];j;j=edge[j].nex){int v=belong[ edge[j].to ];if(u!=v)G[u].pb(v);}}cout<<cnt-find1()<<endl;rep(i,1,cnt)G[i].clear();init();}return 0; }
View Code
转载于:https://www.cnblogs.com/bxd123/p/10799521.html
The King’s Problem 强连通相关推荐
- HDU 3861 The King’s Problem 强连通分量 最小路径覆盖
先找出强连通分量缩点,然后就是最小路径覆盖. 构造一个二分图,把每个点\(i\)拆成两个点\(X_i,Y_i\). 对于原图中的边\(u \to v\),在二分图添加一条边\(X_u \to Y_v\ ...
- HDU 3861 The King’s Problem (强连通缩点+DAG最小路径覆盖)
<题目链接> 题目大意: 一个有向图,让你按规则划分区域,要求划分的区域数最少. 规则如下:1.所有点只能属于一块区域:2,如果两点相互可达,则这两点必然要属于同一区域:3,区域内任意两点 ...
- The King’s Problem(tarjan求强连通分量缩点+匈牙利求有向无环图的最小路径覆盖)
Link:http://acm.hdu.edu.cn/showproblem.php?pid=3861 The King's Problem Time Limit: 2000/1000 MS (Jav ...
- poj 1904 King's Quest 强连通分量+匹配
========== 题目链接King's Quest ============ 题解:通过原有的完美匹配,反向建边,在同一个强连通分量里面的王子和公主可以匹配,而不影响其他王子的结婚对象. //#i ...
- POJ - 1904 King's Quest 强连通tanjar思想
传送门 题意:每个儿子都喜欢许多女孩,问每个渣男儿子最多有几个可以选择备胎.他爹也挺渣.. 猛地一看,哇二分匹配,但是想了想输入输出都能卡时间的题目,循环暴力二分匹配必T无疑,在做强连通模块的题所以想 ...
- POJ - 1904 King's Quest(强连通缩点)
题目链接:点击查看 题目大意:给出n个王子和n个公主,每个王子都有喜欢的公主,每个王子初始时都娶到了一位喜欢的公主,题目需要我们求出每个王子所能娶的所有公主,必须保证王子娶了其中任何一个之后,其他的王 ...
- 【HDOJ图论题集】【转】
1 =============================以下是最小生成树+并查集====================================== 2 [HDU] 3 1213 How ...
- 一系列图论问题[转]
=============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...
- 【转载】图论 500题——主要为hdu/poj/zoj
转自--http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...
- kk_想要学习的知识
2018/4/27 计算几何 一.简介 计算几何属于ACM算法中比较冷门的分类,在省赛中只在前几年考察过,这两年还没有考过,而且和高精度计算一样,遇到题目主要靠套模板,因此对题意的理解至关重要,而且往 ...
最新文章
- Python中的注释(转)
- Apache Spark 2.0预览: 机器学习模型持久化
- 【译】Swift算法俱乐部-Boyer-Moore字符串搜索
- 完整iOS APP发布App Store上架流程
- 数据中心节能环保政策汇总分析:2022年新建大型数据中心PUE需达到1.4以下
- 网络安全:HTTP Host 头攻击相关知识介绍
- 内部类访问局部变量的时候,为什么变量必须加上final修饰
- Linux IPTables:如何添加防火墙规则
- LeetCode(59):螺旋矩阵 II
- 【路径规划】基于matlab改进的人工势场算法机器人避障路径规划【含Matlab源码 1151期】
- python快乐数,快乐数 - SegmentFault 思否
- phpcms移动端和pc端_phpcms 实现PC端、手机端的双模版
- [GIS教程] 5.3 空间数据组织
- 北京功略----玩水篇
- ctfshow菜狗杯wp
- 开篇“给自己定一个目标,明年7月去实现。希望不是一时的兴起。”
- 国产操作系统和Linux
- CS5801|替代LT6711A|HDMI转DP转接线方案|HDMI转DP带供电芯片方案
- canvas 实现图片预览和下载
- Sublime Text 设置成中文版(完整教程)