重联通分量

来源:互联网 发布:淘宝德国代购有假货吗 编辑:程序博客网 时间:2024/05/01 17:22

重联通分量的算法是基于关键节点的,处理方式稍微不同

/*
* this code is made by LinMeiChen
* Problem:
* Type of Problem:
* Thinking:
* Feeling:
*/
#include<iostream>
#include<algorithm>
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
#include<math.h>
#include<string>
#include<vector>
#include<queue>
#include<list>
using namespace std;
typedef long long lld;
typedef unsigned int ud;
#define oo 0x3f3f3f3f
#define maxn 1010
int map[maxn][maxn];
int dfn[maxn], mark[maxn];
int low[maxn];
int n, g_dfn, s;
struct Edge
{
int u, v;
void output(){
printf("%d-%d", u, v);
}
friend bool operator==(Edge& e1, Edge& e2)
{
return (e1.u == e2.u&&e1.v == e2.v) || (e1.u == e1.v&&e1.v == e2.u);
}
}E_stack[maxn];
int top;


void DFS(int u)
{
mark[u] = 1;
for (int v = 1; v <= n; v++)
{
if (map[u][v] == 1)
{
map[u][v] =map[v][u] = 2;
Edge temp;
temp.u = u; temp.v = v;
E_stack[++top]=temp;
if (!mark[v])
{
low[v] = dfn[v] = ++g_dfn;
DFS(v);
low[u] = min(low[v], low[u]);
if (low[v] >= dfn[u])
{
bool first = true;
while (top > 0)
{
if (first) first = false;
else printf(" ");
Edge ttemp = E_stack[top];
ttemp.output();
top--;
if (temp == ttemp)
break;
}
puts("");
}
}
else
low[u] = min(low[u], dfn[v]);
}
}
}


void Init()
{
memset(map, 0, sizeof map);
memset(mark, 0, sizeof mark);
memset(low, 0, sizeof low);
memset(dfn, 0, sizeof dfn);
s = 1;
low[s] = dfn[s] = 1;
g_dfn = 1;
top = 0;
}


int main()
{
int u, v, m;
while(scanf("%d%d", &n, &m)!=EOF)
{
Init();
for (int i = 1; i <= m;i++)
{
scanf("%d%d", &u, &v);
map[u][v] = map[v][u] = 1;
}
DFS(s);
printf("\n");
}
return 0;
}
/*
7 9
1 2
1 3
1 6
1 7
2 3
2 4
2 5
4 5
6 7
4 4
1 2
2 3
3 4
4 1
0 0
*/

0 0
原创粉丝点击