Equivalent Sets(HDU-3836)
Problem Description
To prove two sets A and B are equivalent, we can first prove A is a subset of B, and then prove B is a subset of A, so finally we got that these two sets are equivalent.
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.Input
The input file contains multiple test cases, in each case, the first line contains two integers N <= 20000 and M <= 50000.
Next M lines, each line contains two integers X, Y, means set X in a subset of set Y.Output
For each case, output a single integer: the minimum steps needed.
Sample Input
4 0
3 2
1 2
1 3Sample Output
4
2
題意:給你一個有向圖,問在圖中最少要加多少條邊能使得該圖變成一個強連通圖
思路:縮點模板題
Source Program
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstdlib>
#include<queue>
#include<set>
#include<map>
#include<stack>
#include<ctime>
#include<vector>
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define N 20001
#define MOD 16007
#define E 1e-6
#define LL long long
using namespace std;
int n,m;
vector<int> G[N];
stack<int> S;
int dfn[N],low[N];
bool vis[N];
int sccno[N];
bool in[N],out[N];//記錄入度、出度是否為0
int block_cnt;
int sig;
void Tarjan(int x){
vis[x]=true;
dfn[x]=low[x]=++block_cnt;
S.push(x);
for(int i=0;i<G[x].size();i++){
int y=G[x][i];
if(vis[y]==false){
Tarjan(y);
low[x]=min(low[x],low[y]);
}
else if(!sccno[y])
low[x]=min(low[x],dfn[y]);
}
if(dfn[x]==low[x]){
sig++;
while(true){
int temp=S.top();
S.pop();
sccno[temp]=sig;
if(temp==x)
break;
}
}
}
int shrink(){//縮點
memset(in,false,sizeof(in));
memset(out,false,sizeof(out));
for(int i=1;i<=sig;i++){
in[i]=true;
out[i]=true;
}
for(int x=0;x<n;x++){
for(int i=0;i<G[x].size();i++){
int y=G[x][i];
if(sccno[x]!=sccno[y]){//統計每個點出度、入度是否為0
out[sccno[x]]=false;
in[sccno[y]]=false;
}
}
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF&&(n+m))
{
for(int i=0;i<n;i++)
G[i].clear();
while(m--){
int x,y;
scanf("%d%d",&x,&y);
x--;
y--;
G[x].push_back(y);
}
sig=0;
block_cnt=0;
memset(vis,false,sizeof(vis));
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
memset(sccno,0,sizeof(sccno));
for(int i=0;i<n;i++)
if(vis[i]==false)
Tarjan(i);
shrink();
int a=0,b=0;
for(int i=1;i<=sig;i++){//統計入度、出度為0的點的個數
if(in[i])
a++;
if(out[i])
b++;
}
int res=max(a,b);
if(sig==1)//強連通分量為1時
res=0;
printf("%d\n",res);
}
}
相關文章
- 每日一詞 47 l equivalentUI
- go Exercise: Equivalent Binary TreesGoUI
- [Developer] Grouping setsDeveloper
- 「Python」Numpy equivalent of MATLAB's cell arrayPythonUIMatlab
- mongodb replica sets 測試MongoDB
- SQL grouping sets 子句SQL
- Using Sorted Sets with Jedis APIAPI
- 分析函式 - GROUPING SETS函式
- [LeetCode] 893. Groups of Special-Equivalent StringsLeetCodeUI
- MongoDB 複製集模式Replica SetsMongoDB模式
- Replica sets複製集的搭建
- 關於 grouping sets 學習
- [轉]Trees in SQL: Nested Sets and Materialized PathSQLZed
- Result Sets from Stored Procedures In Oracle (轉)Oracle
- Simple Automated Backups for MongoDB Replica SetsMongoDB
- Three Sets of Vacuum Degassers Awaiting ShipmentAI
- 分析函式 - CUBE和GROUPING SETS函式
- 分析函式 - ROLLUP和GROUPING SETS函式
- Oracle的rollup、cube、grouping sets函式Oracle函式
- MongoDB系列二:Replica Sets安裝與配置MongoDB
- 10 Quality Free Flat Icon Sets for Your Designs
- 並查集 (Union-Find Sets)及其應用並查集
- 解析數倉OLAP函式:ROLLUP、CUBE、GROUPING SETS函式
- GROUP BY中ROLLUP/CUBE/GROUPING/GROUPING SETS使用示例
- mongodb複製集(replica sets)+分片(sharding)環境搭建MongoDB
- PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation3DSegmentation
- Oracle 12C Transport a Database to a Different Platform Using Backup SetsOracleDatabasePlatform
- Redis學習手冊(Sorted-Sets資料型別)Redis資料型別
- All calls to Java have to go via JavaCalls. Sets up the stack frameJavaGo
- 2 sets HDD mud cleaning unit repeat order of Korean contractor
- Important Changes to Oracle Database Patch Sets Starting With 11.2.0.2_1189783.1ImportOracleDatabase
- PHP 7.3 "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"? 解決方法PHPUI
- Oracle OCP(13):GROUPING & GROUPING_ID & GROUP_ID & GROUPING SETSOracle
- kubernetes概念之四:Replication Controller&Replica Sets&DeploymentsController
- Codeforces 486D Valid Sets:Tree dp【n遍O(n)的dp】
- Kubernetes Replica Sets 和 Kubernetes Replica Controller的區別Controller
- MongoDB系列三:Replica Sets在生產環境中安裝配置的注意事項MongoDB
- 微軟確認windows 10 RedStone 4正式版中無Sets管理視窗功能微軟Windows