总是有大佬写的博客特别好!(原来割点割边算法就是Tarjan拓展过去的啊!)
http://www.cnblogs.com/uncle-lu/p/5876729.html
总是想写出自己喜欢的模板格式。
#include <algorithm>
#include <iostream>
#include <string.h>
#include <cstdio>
using namespace std;
const int maxn = 5005;
struct node
{
int v, next;
}edge[maxn*2];
int head[maxn], num[maxn], low[maxn], stack[maxn], visit[maxn];
int index, top, no;
void init()
{
no = index = top = 0;
memset(head, -1, sizeof head);
memset(visit, 0, sizeof visit);
memset(num, 0, sizeof num);
}
void add(int u, int v)
{
edge[no].v = v;
edge[no].next = head[u];
head[u] = no++;
}
void tarjan(int cur)
{
num[cur] = low[cur] = ++index;
stack[++top] = cur;
visit[cur] = 1;
int k = head[cur];
while(k != -1)
{
if(num[edge[k].v] == 0)
{
tarjan(edge[k].v);
low[cur] = min(low[cur], low[edge[k].v]);
}
else if(visit[edge[k].v])
{
low[cur] = min(low[cur], num[edge[k].v]);
}
k = edge[k].next;
}
if(num[cur] == low[cur])
{
do
{
cout << stack[top] << " ";
visit[stack[top]] = 0;
--top;
}
while(cur != stack[top+1]);
cout << endl;
}
}
int main()
{
int n, m, u, v;
while(cin >> n >> m)
{
init();
for(int i = 1; i <= m; ++i)
{
cin >> u >> v;
add(u, v);
}
for(int i = 1; i <= n; ++i)
if(!num[i]) tarjan(i);
}
return 0;
}
继续加油~