博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 3861 The King’s Problem【二分图+强连通分量】
阅读量:6073 次
发布时间:2019-06-20

本文共 2286 字,大约阅读时间需要 7 分钟。

题意:有 n 座城市和 m 条有向边,现在要把这 n 座城市分成一些洲,要求: 如果城市 u,v 之间可以互达则两座城市要分在一个洲里面,

        每个洲里面的任意两个城市 u,v之间至少需要存在一条边,问做少能够分成多少个洲。

分析:先求强连通分量并进行缩点,重新建图,如果两个强连通分量之间如果存在一条边连接其中一个强连通分量内部的一个点和另一个强

        连通分量内部的一个点则连一条边从第一个强连通分量到第二个强连通分量,求出最小路径覆盖即为答案。

#include
#include
#define clr(x)memset(x,0,sizeof(x))#define min(a,b)(a)<(b)?(a):(b)#define maxn 5005#define maxm 3000000struct node{ int to,next;}e[maxm],ed[maxm];int tot;int tt;int xh[maxn];int head[maxn];void add(int s,int t){ e[tot].to=t; e[tot].next=head[s]; head[s]=tot++;}void add2(int s,int t){ ed[tt].to=t; ed[tt].next=xh[s]; xh[s]=tt++;}int sn,top,ti;int dfn[maxn];int low[maxn];int ins[maxn];int sta[maxn];int col[maxn];void tarjan(int u){ dfn[u]=low[u]=++ti; sta[++top]=u; ins[u]=1; int i,k; for(i=head[u];i;i=e[i].next) { k=e[i].to; if(dfn[k]==0) { tarjan(k); low[u]=min(low[u],low[k]); } else if(ins[k]) low[u]=min(low[u],dfn[k]); } if(dfn[u]==low[u]) { sn++; do { k=sta[top--]; ins[k]=0; col[k]=sn; }while(k!=u); }}int link[maxn];int v[maxn];int find(int x){ int i,k; for(i=xh[x];i;i=ed[i].next) { k=ed[i].to; if(!v[k]) { v[k]=1; if(link[k]==0||find(link[k])) { link[k]=x; return 1; } } } return 0;}int main(){ int t,n,m,i,j; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); clr(head); tot=1; int a,b; while(m--) { scanf("%d%d",&a,&b); add(a,b); } sn=top=ti=0; clr(dfn); clr(col); for(i=1;i<=n;i++) if(!dfn[i]) tarjan(i); clr(xh); tt=1; clr(link); clr(v); for(i=1;i<=n;i++) for(j=head[i];j;j=e[j].next) if(col[i]!=col[e[j].to]) add2(col[i],col[e[j].to]); int sum=0; for(i=1;i<=sn;i++) { clr(v); if(find(i)) sum++; } printf("%d\n",sn-sum); } return 0;}

 

转载于:https://www.cnblogs.com/dream-wind/archive/2012/10/01/2709920.html

你可能感兴趣的文章
Nexus Repository Manager 搭建私有docker仓库
查看>>
Python RPC 之 Thrift
查看>>
ThinkPHP5
查看>>
MySQL级联删除的问题
查看>>
php数据库类
查看>>
阿里巴巴Java开发手册
查看>>
【精】H5移动端webapp开发(快装app)项目案例
查看>>
1.1 学习之初 1.2 约定 1.3 认识Linux 1.4 安装虚拟机 1.5 安装centos7
查看>>
一张图读懂“云栖大会·南京峰会”重磅发布产品
查看>>
hi3519/hi3516AV200交叉编译opencv的精简版本
查看>>
区块链100讲:如何使用开发环境命令行注册EOS靓号及变更EOS账号的active key和其他...
查看>>
区块链100讲:以太坊智能合约solidity如何节省GAS费?
查看>>
解决python3中解压zip文件是文件名乱码的问题
查看>>
lucene 评分要素解析
查看>>
为什么学习大数据,大数据专家写给大数据分析学习者的10个理由
查看>>
学习Python时最容易遇到的12种错误希望可以让你避开这些坑!
查看>>
VIM 使用
查看>>
模板设计模式
查看>>
如何优雅的编程——C语言界面的一点小建议
查看>>
Visual Paradigm 教程[企业架构]:如何使用TOGAF ADM软件(一)
查看>>