Skip to content

Commit 40a8f31

Browse files
committed
2nd
1 parent c628ab3 commit 40a8f31

File tree

4 files changed

+474
-0
lines changed

4 files changed

+474
-0
lines changed

Graph/Articulation points.cpp

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
#include<bits/stdc++.h>
2+
#include<ext/pb_ds/assoc_container.hpp>
3+
#include<ext/pb_ds/tree_policy.hpp>
4+
#define FIO ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
5+
#define Fileio freopen("output.txt","w",stdout);freopen("input.txt","r",stdin);
6+
#define all(v) v.begin(),v.end()
7+
#define rall(v) v.rbegin(),v.rend()
8+
#define MEM(a,x) memset(a,x,sizeof(a))
9+
#define SZ(v) v.size()
10+
#define nl "\n"
11+
#define bug cout<<"bug"<<nl;
12+
#define pi acos(-1.0)
13+
#define ll long long
14+
#define pb push_back
15+
#define mp make_pair
16+
#define pii pair< int,int >
17+
#define pll pair< ll,ll >
18+
#define vii vector< int >
19+
#define vll vector< ll >
20+
#define vpi vector< pii >
21+
#define vpl vector<pll>
22+
#define MX 100005
23+
#define EPS 1e-12
24+
#define ss second
25+
#define ff first
26+
using namespace std;
27+
using namespace __gnu_pbds;
28+
29+
template<typename T>
30+
using ordered_set=tree<T,null_type,less<T>,rb_tree_tag,tree_order_statistics_node_update>;
31+
template<typename T>
32+
using ordered_multiset=tree<T, null_type, less_equal<T>, rb_tree_tag,tree_order_statistics_node_update>;
33+
34+
inline ll powr(int a,int b){ll res=1;while(b){if(b&1) res*=a;a*=a;b/=2;}return res;}
35+
int cases=1;
36+
37+
#ifdef ppqq
38+
#define debug(...) __f(#__VA_ARGS__, __VA_ARGS__)
39+
template < typename Arg1 >
40+
void __f(const char* name, Arg1&& arg1){
41+
cerr << name << " is " << arg1 << std::endl;
42+
}
43+
template < typename Arg1, typename... Args>
44+
void __f(const char* names, Arg1&& arg1, Args&&... args){
45+
const char* comma = strchr(names+1, ',');
46+
cerr.write(names, comma - names) << " is " << arg1 <<" ";
47+
__f(comma+1, args...);
48+
}
49+
#else
50+
#define debug(...)
51+
#endif
52+
53+
///******************************************START******************************************
54+
55+
int n,m,timer;
56+
vector<int> adj[100005],in_time,low;
57+
vector<bool> vis,cut_ver;
58+
59+
void dfs(int u,int p)
60+
{
61+
int child=0;
62+
in_time[u]=low[u]=timer++;
63+
vis[u]=true;
64+
65+
for(auto it: adj[u])
66+
{
67+
if(it==p) continue;
68+
if(vis[it])
69+
low[u]=min(in_time[it],low[u]);
70+
else
71+
{
72+
dfs(it,u);
73+
low[u]=min(low[u],low[it]);
74+
if(low[it]>=in_time[u] && p!=-1)
75+
cut_ver[u]=true;
76+
child++;
77+
}
78+
}
79+
80+
if(p==-1 && child>1) cut_ver[u]=true;
81+
}
82+
void findArticulationPoints()
83+
{
84+
in_time.assign(n+2,0);
85+
low.assign(n+2,0);
86+
vis.assign(n+2,false);
87+
cut_ver.assign(n+2,0);
88+
timer=1;
89+
for(int i=1;i<=n;i++)
90+
if(!vis[i]) dfs(i,-1);
91+
92+
for(int i=1;i<=n;i++)
93+
if(cut_ver[i]) cout<<i<<" ";
94+
}
95+
96+
int main()
97+
{
98+
FIO;
99+
cin>>n>>m;
100+
for(int i=0,x,y;i<m;i++)
101+
{
102+
cin>>x>>y;
103+
adj[x].push_back(y);
104+
adj[y].push_back(x);
105+
}
106+
107+
findArticulationPoints();
108+
}

Graph/Finding Bridge.cpp

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
#include<bits/stdc++.h>
2+
#include<ext/pb_ds/assoc_container.hpp>
3+
#include<ext/pb_ds/tree_policy.hpp>
4+
#define FIO ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
5+
#define Fileio freopen("output.txt","w",stdout);freopen("input.txt","r",stdin);
6+
#define all(v) v.begin(),v.end()
7+
#define rall(v) v.rbegin(),v.rend()
8+
#define MEM(a,x) memset(a,x,sizeof(a))
9+
#define SZ(v) v.size()
10+
#define nl "\n"
11+
#define bug cout<<"bug"<<nl;
12+
#define pi acos(-1.0)
13+
#define ll long long
14+
#define pb push_back
15+
#define mp make_pair
16+
#define pii pair< int,int >
17+
#define pll pair< ll,ll >
18+
#define vii vector< int >
19+
#define vll vector< ll >
20+
#define vpi vector< pii >
21+
#define vpl vector<pll>
22+
#define MX 100005
23+
#define EPS 1e-12
24+
#define ss second
25+
#define ff first
26+
using namespace std;
27+
using namespace __gnu_pbds;
28+
29+
template<typename T>
30+
using ordered_set=tree<T,null_type,less<T>,rb_tree_tag,tree_order_statistics_node_update>;
31+
template<typename T>
32+
using ordered_multiset=tree<T, null_type, less_equal<T>, rb_tree_tag,tree_order_statistics_node_update>;
33+
34+
inline ll powr(int a,int b){ll res=1;while(b){if(b&1) res*=a;a*=a;b/=2;}return res;}
35+
int cases=1;
36+
37+
#ifdef ppqq
38+
#define debug(...) __f(#__VA_ARGS__, __VA_ARGS__)
39+
template < typename Arg1 >
40+
void __f(const char* name, Arg1&& arg1){
41+
cerr << name << " is " << arg1 << std::endl;
42+
}
43+
template < typename Arg1, typename... Args>
44+
void __f(const char* names, Arg1&& arg1, Args&&... args){
45+
const char* comma = strchr(names+1, ',');
46+
cerr.write(names, comma - names) << " is " << arg1 <<" ";
47+
__f(comma+1, args...);
48+
}
49+
#else
50+
#define debug(...)
51+
#endif
52+
53+
///******************************************START******************************************
54+
55+
int n,m,timer;
56+
vector<int> adj[100005],in_time,low;
57+
vector<pair<int,int>> bridge;
58+
vector<bool> vis,cut_ver;
59+
60+
void dfs(int u,int p)
61+
{
62+
in_time[u]=low[u]=timer++;
63+
vis[u]=true;
64+
65+
for(auto it: adj[u])
66+
{
67+
if(it==p) continue;
68+
if(vis[it])
69+
low[u]=min(in_time[it],low[u]);
70+
else
71+
{
72+
dfs(it,u);
73+
low[u]=min(low[u],low[it]);
74+
if(low[it]>in_time[u])
75+
bridge.push_back({u,it});
76+
}
77+
}
78+
}
79+
void findBridges()
80+
{
81+
in_time.assign(n+2,0);
82+
low.assign(n+2,0);
83+
vis.assign(n+2,false);
84+
cut_ver.assign(n+2,0);
85+
timer=1;
86+
for(int i=1;i<=n;i++)
87+
if(!vis[i]) dfs(i,-1);
88+
89+
for(auto it: bridge) cout<<it.first<<" "<<it.second<<"\n";
90+
}
91+
92+
int main()
93+
{
94+
FIO;
95+
cin>>n>>m;
96+
for(int i=0,x,y;i<m;i++)
97+
{
98+
cin>>x>>y;
99+
adj[x].pb(y);
100+
adj[y].pb(x);
101+
}
102+
103+
findBridges();
104+
105+
106+
107+
108+
109+
110+
111+
112+
113+
114+
115+
116+
117+
118+
119+
120+
}
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
#include<bits/stdc++.h>
2+
#include<ext/pb_ds/assoc_container.hpp>
3+
#include<ext/pb_ds/tree_policy.hpp>
4+
#define FIO ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
5+
#define Fileio freopen("output.txt","w",stdout);freopen("input.txt","r",stdin);
6+
#define all(v) v.begin(),v.end()
7+
#define rall(v) v.rbegin(),v.rend()
8+
#define MEM(a,x) memset(a,x,sizeof(a))
9+
#define SZ(v) v.size()
10+
#define nl "\n"
11+
#define bug cout<<"bug"<<nl;
12+
#define pi acos(-1.0)
13+
#define ll long long
14+
#define pb push_back
15+
#define mp make_pair
16+
#define pii pair< int,int >
17+
#define pll pair< ll,ll >
18+
#define vii vector< int >
19+
#define vll vector< ll >
20+
#define vpi vector< pii >
21+
#define vpl vector<pll>
22+
#define MX 100005
23+
#define EPS 1e-12
24+
#define ss second
25+
#define ff first
26+
using namespace std;
27+
using namespace __gnu_pbds;
28+
29+
template<typename T>
30+
using ordered_set=tree<T,null_type,less<T>,rb_tree_tag,tree_order_statistics_node_update>;
31+
template<typename T>
32+
using ordered_multiset=tree<T, null_type, less_equal<T>, rb_tree_tag,tree_order_statistics_node_update>;
33+
34+
inline ll powr(int a,int b){ll res=1;while(b){if(b&1) res*=a;a*=a;b/=2;}return res;}
35+
int cases=1;
36+
37+
#ifdef ppqq
38+
#define debug(...) __f(#__VA_ARGS__, __VA_ARGS__)
39+
template < typename Arg1 >
40+
void __f(const char* name, Arg1&& arg1){
41+
cerr << name << " is " << arg1 << std::endl;
42+
}
43+
template < typename Arg1, typename... Args>
44+
void __f(const char* names, Arg1&& arg1, Args&&... args){
45+
const char* comma = strchr(names+1, ',');
46+
cerr.write(names, comma - names) << " is " << arg1 <<" ";
47+
__f(comma+1, args...);
48+
}
49+
#else
50+
#define debug(...)
51+
#endif
52+
53+
///******************************************START******************************************
54+
55+
///test: https://www.hackerearth.com/practice/algorithms/graphs/strongly-connected-components/tutorial/
56+
57+
int n,m,cnt;
58+
vector<int> adj[100005],rev[100005];
59+
bool vis[100005];
60+
stack<int> st;
61+
void dfs1(int u)
62+
{
63+
vis[u]=true;
64+
for(auto it: adj[u])
65+
if(!vis[it]) dfs1(it);
66+
st.push(u);
67+
}
68+
void dfs2(int u)
69+
{
70+
cnt++;
71+
vis[u]=true;
72+
for(auto it: rev[u]){
73+
if(!vis[it]) dfs2(it);
74+
}
75+
}
76+
void SCC()
77+
{
78+
for(int i=1;i<=n;i++)
79+
if(!vis[i]) dfs1(i);
80+
81+
for(int i=1;i<=n;i++) vis[i]=false;
82+
83+
int odd=0,even=0;
84+
85+
while(!st.empty())
86+
{
87+
int u=st.top();
88+
st.pop();
89+
if(!vis[u])
90+
{
91+
cnt=0;
92+
dfs2(u);
93+
if(cnt%2) odd+=cnt;
94+
else even+=cnt;
95+
}
96+
}
97+
cout<<odd-even;
98+
}
99+
int main()
100+
{
101+
FIO;
102+
cin>>n>>m;
103+
for(int i=0,x,y;i<m;i++)
104+
{
105+
cin>>x>>y;
106+
adj[x].push_back(y);
107+
rev[y].push_back(x);
108+
}
109+
110+
SCC();
111+
}

0 commit comments

Comments
 (0)