양 방향 dfs 강 한 연결 분량 구하 기
8437 단어 도 론의 연통 분량
#include
#include
using namespace std;
#define mem(arr,a) memset(arr,a,sizeof(arr))
#define N 10000+10
int v;
vector<int>G[N];
vector<int>rG[N];
vector<int>vs;
bool used[N];
int cmp[N];
int n, m;
void add(int from, int to){
G[from].push_back(to);
rG[to].push_back(from);
}
void dfs(int v){
used[v] = true;
for (int i = 0; i < G[v].size(); i++){
if (!used[G[v][i]])dfs(G[v][i]);
}
vs.push_back(v);
}
void rdfs(int v, int k){
used[v] = true;
cmp[v] = k;
for (int i = 0; i < rG[v].size(); i++){
if (!used[rG[v][i]])rdfs(rG[v][i], k);
}
}
int scc(){
mem(used, 0);
vs.clear();
for (int v = 1; v <= n; v++){
if (!used[v])
dfs(v);
}
mem(used, 0);
int k = 0;
for (int i = vs.size() - 1; i >= 0; i--){
if (!used[vs[i]])
rdfs(vs[i], k++);
}
return k;
}
int main(){
while (cin >> n >> m){
if (!n&&!m)break;
for (int i = 0; i <= n; i++){
G[i].clear();
rG[i].clear();
}
while (m--){
int a, b; cin >> a >> b;
add(a, b);
}
if (scc() == 1)cout << "Yes" << endl;
else cout << "No" << endl;
}
}
다음은 틀 렸 다. 나 도 왜 그런 지 생각 하고 있다.
#include
#include
using namespace std;
#define mem(arr,a) memset(arr,a,sizeof(arr))
#define N 10000+10
int v;
vector<int>G[N];
vector<int>rG[N];
vector<int>vs;
bool used[N];
int cmp[N];
int n, m;
void add(int from, int to){
G[from].push_back(to);
rG[to].push_back(from);
}
void dfs(int v){
used[v] = true;
vs.push_back(v);
for (int i = 0; i < G[v].size(); i++){
if (!used[G[v][i]])dfs(G[v][i]);
}
}
void rdfs(int v, int k){
used[v] = true;
cmp[v] = k;
for (int i = 0; i < rG[v].size(); i++){
if (!used[rG[v][i]])rdfs(rG[v][i], k);
}
}
int scc(){
mem(used, 0);
vs.clear();
for (int v = 1; v <= n; v++){
if (!used[v])
dfs(v);
}
mem(used, 0);
int k = 0;
for (int i = 0; i < vs.size();i++)
{
if (!used[vs[i]])
rdfs(vs[i], k++);
}
return k;
}
int main(){
while (cin >> n >> m){
if (!n&&!m)break;
for (int i = 0; i <= n; i++){
G[i].clear();
rG[i].clear();
}
while (m--){
int a, b; cin >> a >> b;
add(a, b);
}
if (scc() == 1)cout << "Yes" << endl;
else cout << "No" << endl;
}
}