[tarjan] hdu 3836 Equivalent Sets
主题链接:
http://acm.hdu.edu.cn/showproblem.php?
pid=3836
Equivalent Sets
Time Limit: 12000/4000 MS (Java/Others) Memory Limit: 104857/104857 K (Java/Others)
Total Submission(s): 2890 Accepted Submission(s): 1006
You are to prove N sets are equivalent, using the method above: in each step you can prove a set X is a subset of another set Y, and there are also some sets that are already proven to be subsets of some other sets.
Now you want to know the minimum steps needed to get the problem proved.
Next M lines, each line contains two integers X, Y, means set X in a subset of set Y.
4 0
3 2
1 2
1 3
4
2HintCase 2: First prove set 2 is a subset of set 1 and then prove set 3 is a subset of set 1.
pid=3834" target="_blank" style="color:rgb(26,92,200); text-decoration:none">3834
3830pid=3833" target="_blank" style="color:rgb(26,92,200); text-decoration:none">3833
Statistic | Submit | problemid=3836" style="color:rgb(26,92,200); text-decoration:none">Discuss
题目意思:
求至少须要增添多少条边,使得该图为强连通图。
解题思路:
tarjan求强连通。然后统计入度为0和出度为0的强连通分量个数,两者的最大值即为答案。
代码:
//#include<CSpreadSheet.h> #include<iostream>
#include<cmath>
#include<cstdio>
#include<sstream>
#include<cstdlib>
#include<string>
#include<string.h>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#include<ctime>
#include<bitset>
#include<cmath>
#define eps 1e-6
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define ll __int64
#define LL long long
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
#define M 1000000007
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std; #define Maxn 21000
int low[Maxn],dfn[Maxn],dindex,n;
int sta[Maxn],belong[Maxn],bcnt,ss;
bool iss[Maxn];
int de1[Maxn],de2[Maxn];
vector<vector<int> >myv; void tarjan(int cur)
{
//printf(":%d\n",cur);
//system("pause");
int ne; dfn[cur]=low[cur]=++dindex;
iss[cur]=true;
sta[++ss]=cur; for(int i=0;i<myv[cur].size();i++)
{
ne=myv[cur][i];
if(!dfn[ne])
{
tarjan(ne);
low[cur]=min(low[cur],low[ne]);
}
else if(iss[ne]&&dfn[ne]<low[cur])
low[cur]=dfn[ne];
} if(dfn[cur]==low[cur])
{
bcnt++;
do
{
ne=sta[ss--];
iss[ne]=false;
belong[ne]=bcnt;
}while(ne!=cur);
}
} void solve()
{
int i;
ss=bcnt=dindex=0;
memset(dfn,0,sizeof(dfn));
memset(iss,false,sizeof(iss));
for(int i=1;i<=n;i++)
if(!dfn[i])
tarjan(i);
} int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
while(~scanf("%d",&n))
{
myv.clear();
myv.resize(n+1);
int m;
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
myv[a].push_back(b);
}
solve(); if(bcnt==1)
{
printf("1\n0\n");
continue;
}
int ansa=0,ansb=0; memset(de1,0,sizeof(de1));
memset(de2,0,sizeof(de2)); for(int i=1;i<=n;i++)
{
for(int j=0;j<myv[i].size();j++)
{
int ne=myv[i][j];
if(belong[i]!=belong[ne])
{
de1[belong[ne]]++;//Èë¶È
de2[belong[i]]++; //³ö¶È
} }
}
for(int i=1;i<=bcnt;i++)
{
if(!de1[i])
ansa++;
if(!de2[i])
ansb++;
} ansb=max(ansb,ansa); printf("%d\n",ansb);
}
return 0;
}
版权声明:本文博客原创文章。博客,未经同意,不得转载。
[tarjan] hdu 3836 Equivalent Sets的更多相关文章
- hdu 3836 Equivalent Sets
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=3836 Equivalent Sets Description To prove two sets A ...
- hdu 3836 Equivalent Sets trajan缩点
Equivalent Sets Time Limit: 12000/4000 MS (Java/Others) Memory Limit: 104857/104857 K (Java/Other ...
- hdu 3836 Equivalent Sets(强连通分量--加边)
Equivalent Sets Time Limit: 12000/4000 MS (Java/Others) Memory Limit: 104857/104857 K (Java/Other ...
- hdu——3836 Equivalent Sets
Equivalent Sets Time Limit: 12000/4000 MS (Java/Others) Memory Limit: 104857/104857 K (Java/Other ...
- hdu 3836 Equivalent Sets(tarjan+缩点)
Problem Description To prove two sets A and B are equivalent, we can first prove A is a subset of B, ...
- hdu - 3836 Equivalent Sets(强连通)
http://acm.hdu.edu.cn/showproblem.php?pid=3836 判断至少需要加几条边才能使图变成强连通 把图缩点之后统计入度为0的点和出度为0的点,然后两者中的最大值就是 ...
- HDU - 3836 Equivalent Sets (强连通分量+DAG)
题目大意:给出N个点,M条边.要求你加入最少的边,使得这个图变成强连通分量 解题思路:先找出全部的强连通分量和桥,将强连通分量缩点.桥作为连线,就形成了DAG了 这题被坑了.用了G++交的,结果一直R ...
- hdoj 3836 Equivalent Sets【scc&&缩点】【求最少加多少条边使图强连通】
Equivalent Sets Time Limit: 12000/4000 MS (Java/Others) Memory Limit: 104857/104857 K (Java/Other ...
- HUD——T 3836 Equivalent Sets
http://acm.hdu.edu.cn/showproblem.php?pid=3836 Time Limit: 12000/4000 MS (Java/Others) Memory Lim ...
随机推荐
- 一个简单的Java死锁示例(转)
在实际编程中,要尽量避免出现死锁的情况,但是让你故意写一个死锁的程序时似乎也不太简单(有公司会出这样的面试题),以下是一个简单的死锁例子,程序说明都写着类的注释里了,有点罗嗦,但是应该也还是表述清楚了 ...
- java.lang.IllegalStateException: You need to use a Theme.AppCompat theme
配置: 中设置theme为 <application android:allowBackup="true" android:icon="@mipmap/ic_lau ...
- 通过.NET实现后台自动发送Email功能的代码示例
原文:通过.NET实现后台自动发送Email功能的代码示例 通过.NET实现后台自动发送邮件功能的代码,可以将一些基础信息放到web.config文件中进行保存: Web.config文件信息段: & ...
- C 这些东西的内存管理
一.内存介绍 本文主要介绍C内存管理基本概念,以及C语言编译后的可执行程序的存储结构和执行结构. 在用户存储空间,一个C程序的在内存中的分配分类5大部分:代码段.全局已初始化数据段.bss段.堆和栈. ...
- Java依据Url下载图片
package com.ronniewang.downloadpicture; import java.io.DataInputStream; import java.io.File; import ...
- 一个SQL面试题
面试问题都是基于 bug统计分析续(一)基于SQL的Bug统计方法 中3-2节的讨论抽象出来的. 题目:如果一张表有AC两列,怎么找各种C里不同A的数目.并列出相相应的C的值,并找出每种C下A最多的A ...
- WPF - Visual调试工具Snoop
原文:WPF - Visual调试工具Snoop Snoop经过很长一段时间,最近更新到支持NET 3.5了,它是一个WPF运行时对Visual UI调试的一个工具,最近我用过它调试修改过一个bug, ...
- iOS开发- "duplicate symbol for architecture i386" 解决的方法
今天整合项目的时候, 遇到了这样一个问题. duplicate symbol _flag in: /Users/apple/Library/Developer/Xcode/DerivedData/bl ...
- 【百度地图API】发布静态图API啦!只需一个网址,即可展示定制百度地图!
原文:[百度地图API]发布静态图API啦!只需一个网址,即可展示定制百度地图! 摘要: 百度地图静态图API!您无须执行任何“特殊”操作便可在网页上显示此图片. 不需要 JavaScript.我们只 ...
- 访问Ice-Pick Lodge:假设公众筹款网站Kickstarter在成功
Xsolla非常高兴採訪了来自莫斯科的工作室 Ice-Pick Lodge的Golubeva.数天前,该公司已成功在Kickstarter上募集资金,创造出最知名的游戏"Pathologic ...