hdoj 3861 The King’s Problem【强连通缩点建图&&最小路径覆盖】
The King’s Problem
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2259 Accepted Submission(s):
795
There are N cities in the kingdom and there are M directional roads between the
cities. That means that if there is a road from u to v, you can only go from
city u to city v, but can’t go from city v to city u. In order to rule his
kingdom more effectively, the king want to divide his kingdom into several
states, and each city must belong to exactly one state. What’s
more, for each pair of city (u, v), if there is one way to go from u to v and go
from v to u, (u, v) have to belong to a same state. And the king must
insure that in each state we can ether go from u to v or go from v to u between
every pair of cities (u, v) without passing any city which belongs to other
state.
Now the king asks for your help, he wants to know the least number
of states he have to divide the kingdom into.
of test cases. And then followed T cases.
The first line for each case
contains two integers n, m(0 < n <= 5000,0 <= m <= 100000), the
number of cities and roads in the kingdom. The next m lines each contains two
integers u and v (1 <= u, v <= n), indicating that there is a road going
from city u to city v.
you should just output an integer which is the least number of states the king
have to divide into.
- #include<stdio.h>
- #include<string.h>
- #include<stack>
- #include<queue>
- #include<vector>
- #include<algorithm>
- #define MAX 5200
- #define MAXM 200100
- using namespace std;
- vector<int>newmap[MAX];
- vector<int>scc[MAX];
- int sccno[MAX];
- int in[MAX],out[MAX];
- int scccnt,dfsclock;
- int n,m;
- int low[MAX],dfn[MAX];
- int instack[MAX];
- int ans,head[MAX];
- int vis[MAX],city[MAX];
- stack<int>s;
- struct node
- {
- int beg,end,next;
- }edge[MAXM];
- void init()
- {
- ans=0;
- memset(head,-1,sizeof(head));
- }
- void add(int u,int v)
- {
- edge[ans].beg=u;
- edge[ans].end=v;
- edge[ans].next=head[u];
- head[u]=ans++;
- }
- void getmap()
- {
- int a,b;
- while(m--)
- {
- scanf("%d%d",&a,&b);
- add(a,b);
- }
- }
- void tarjan(int u)
- {
- int v,i,j;
- low[u]=dfn[u]=++dfsclock;
- s.push(u);
- instack[u]=1;
- for(i=head[u];i!=-1;i=edge[i].next)
- {
- v=edge[i].end;
- if(!dfn[v])
- {
- tarjan(v);
- low[u]=min(low[u],low[v]);
- }
- else if(instack[v])
- low[u]=min(low[u],dfn[v]);
- }
- if(dfn[u]==low[u])
- {
- scccnt++;
- while(1)
- {
- v=s.top();
- s.pop();
- instack[v]=0;
- sccno[v]=scccnt;
- if(v==u)
- break;
- }
- }
- }
- void find(int l,int r)
- {
- memset(low,0,sizeof(low));
- memset(dfn,0,sizeof(dfn));
- memset(instack,0,sizeof(instack));
- memset(sccno,0,sizeof(sccno));
- dfsclock=scccnt=0;
- for(int i=l;i<=r;i++)
- {
- if(!dfn[i])
- tarjan(i);
- }
- }
- void suodian()
- {
- find(1,n);
- for(int i=1;i<=scccnt;i++)
- newmap[i].clear();
- memset(in,0,sizeof(in));
- memset(out,0,sizeof(out));
- int u,v,i,j;
- for(i=0;i<ans;i++)
- {
- u=sccno[edge[i].beg];
- v=sccno[edge[i].end];
- if(u!=v)
- {
- newmap[u].push_back(v);
- in[v]++;
- out[u]++;
- }
- }
- }
- int query(int x)
- {
- int i,j;
- for(i=0;i<newmap[x].size();i++)
- {
- int y=newmap[x][i];
- if(!vis[y])
- {
- vis[y]=1;
- if(city[y]==0||query(city[y]))
- {
- city[y]=x;
- return 1;
- }
- }
- }
- return 0;
- }
- void solve()
- {
- int i,j;
- int sum=0;
- memset(city,0,sizeof(city));
- for(i=1;i<=scccnt;i++)
- {
- memset(vis,0,sizeof(vis));
- if(query(i))
- sum++;
- }
- printf("%d\n",scccnt-sum);//最小路径覆盖=顶点数-最大匹配数
- }
- int main()
- {
- int t;
- scanf("%d",&t);
- while(t--)
- {
- scanf("%d%d",&n,&m);
- init();
- getmap();
- suodian();
- solve();
- }
- return 0;
- }
hdoj 3861 The King’s Problem【强连通缩点建图&&最小路径覆盖】的更多相关文章
- HDU 3861 The King’s Problem(tarjan连通图与二分图最小路径覆盖)
题意:给我们一个图,问我们最少能把这个图分成几部分,使得每部分内的任意两点都能至少保证单向连通. 思路:使用tarjan算法求强连通分量然后进行缩点,形成一个新图,易知新图中的每个点内部的内部点都能保 ...
- HDU 3861 The King’s Problem (强连通缩点+DAG最小路径覆盖)
<题目链接> 题目大意: 一个有向图,让你按规则划分区域,要求划分的区域数最少. 规则如下:1.所有点只能属于一块区域:2,如果两点相互可达,则这两点必然要属于同一区域:3,区域内任意两点 ...
- hdu 3861 The King’s Problem trajan缩点+二分图匹配
The King’s Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- HDU 3861 The King’s Problem 强连通分量 最小路径覆盖
先找出强连通分量缩点,然后就是最小路径覆盖. 构造一个二分图,把每个点\(i\)拆成两个点\(X_i,Y_i\). 对于原图中的边\(u \to v\),在二分图添加一条边\(X_u \to Y_v\ ...
- hdu3861 The King’s Problem 强连通缩点+DAG最小路径覆盖
对多校赛的题目,我深感无力.题目看不懂,英语是能懂的,题目具体的要求以及需要怎么做没有头绪.样例怎么来的都不明白.好吧,看题解吧. http://www.cnblogs.com/kane0526/ar ...
- hdu3861 强连通分量缩点+二分图最最小路径覆盖
The King’s Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- HDU 3861 The King’s Problem 最小路径覆盖(强连通分量缩点+二分图最大匹配)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3861 最小路径覆盖的一篇博客:https://blog.csdn.net/qq_39627843/ar ...
- HDU 3861 The King's Problem(强连通分量缩点+最小路径覆盖)
http://acm.hdu.edu.cn/showproblem.php?pid=3861 题意: 国王要对n个城市进行规划,将这些城市分成若干个城市,强连通的城市必须处于一个州,另外一个州内的任意 ...
- HDU 3861 The King’s Problem(tarjan缩点+最小路径覆盖:sig-最大二分匹配数,经典题)
The King’s Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
随机推荐
- python 进程信息
通过psutil模块读取机器进程信息: #-*- coding: UTF-8 -*-import psutil;import osimport CommMethod '''获取机器当前进程信息'''d ...
- 肾果手机App Store切换区域(无需Visa或者万事达)
8月份在肾果官网买了个touch6,有时候需要换区去墙外下载app,然而一个个国家都要输入Visa或者万事达卡...今天终于找到一个不用输入信用卡号的区域:Canada!!! 办法(适用于8.X,7. ...
- asp.net gridview 绑定图片字段,图片不显示
在浏览器中查看,图片属性. 右键查看,若后面出现若干%20 可使用以下办法解决. 备份表数据,然后删除表,把图片路径字符串在数据库中应使用varchar()类型. 原因可以查看vchar() var ...
- ExtJS4.2学习(17)表单基本输入控件Ext.form.Field(转)
鸣谢:http://www.shuyangyang.com.cn/jishuliangongfang/qianduanjishu/2013-12-11/189.html --------------- ...
- CSS content内容生成技术以及应用(转)
一.哗啦哗啦的简介 zxx://这里“哗啦哗啦”的作用是为了渲染一种氛围.content属性早在 CSS2.1的时候就被引入了,可以使用:before以及:after伪元素生成内容.此特性目前已被大部 ...
- 解决ubuntu无法调整和保存屏幕亮度的问题
整理自解决ubuntu无法调整和保存屏幕亮度的问题 ubuntu无法调整屏幕亮度,对笔记本来说很耗电,同时也很刺眼,因为它是默认以最大亮度来工作的. 所谓的调整,方法为下面的其中一种: 1.Fn+左右 ...
- POJ 3352 Road Construction (边双连通分量)
题目链接 题意 :有一个景点要修路,但是有些景点只有一条路可达,若是修路的话则有些景点就到不了,所以要临时搭一些路,以保证无论哪条路在修都能让游客到达任何一个景点 思路 :把景点看成点,路看成边,看要 ...
- codeforces Vasya and Digital Root
/* * c.cpp * * Created on: 2013-10-7 * Author: wangzhu */ /** * 当时比赛时,想得复杂了,也想偏了, * 1).写出来之后,结果达到了预期 ...
- 140. Word Break II
题目: Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where e ...
- Android Binder设计与实现 - 设计篇
要 Binder是Android系统进程间通信(IPC)方式之一.Linux已经拥有管道,system V IPC,socket等IPC手段,却还要倚赖Binder来实现进程间通信,说明Binder具 ...