| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
人气这么低,贴个标程作参考./* -*- c++ -*-
ID: dirtysalt
PROG:
LANG: C++
copy[write] by dirlt(dirtysalt1987@gmail.com) */
#include <cstdio>
#include <cstdlib>
#include <cctype>
#include <cmath>
#include <cassert>
#include <cstring>
#include <iostream>
#include <sstream>
#include <fstream>
#include <string>
#include <vector>
#include <list>
#include <queue>
#include <stack>
#include <deque>
#include <map>
#include <numeric>
#include <algorithm>
using namespace std;
typedef long long LL;
typedef vector < int >VI;
typedef vector < string > VS;
typedef vector < double >VD;
typedef pair < int, int >PII;
#define SZ(v) ((int)((sizeof(v))/sizeof(*(v))))
#define MAX_N 1010
#define MAX_DEG 4
#define MAX_M (MAX_DEG*MAX_N/2)
int n, m;
int deg[MAX_N + 1];
int adj[MAX_N + 1][MAX_DEG];
int dfs[MAX_N + 1];
int back[MAX_N + 1];
int n_stack, dfn;
int v_stack[MAX_M];
int w_stack[MAX_M];
int
min(int x, int y)
{
return (x < y) ? x : y;
}
int
read_case(void)
{
int i, u, v, t;
t = scanf("%d %d", &n, &m);
if (n == 0 && m == 0) {
return 0;
}
for (i = 1; i <= n; i++) {
deg[i] = 0;
}
for (i = 0; i < m; i++) {
t = scanf("%d %d", &u, &v);
adj[u][deg[u]++] = v;
adj[v][deg[v]++] = u;
}
return 1;
}
void
bicomp(int v, int pred)
{
int i, w, count;
dfn++;
dfs[v] = back[v] = dfn;
for (i = 0; i < deg[v]; i++) {
w = adj[v][i];
if (dfs[w] < dfs[v] && w != pred) {
/* back edge or unexamined forward edge */
v_stack[n_stack] = v;
w_stack[n_stack] = w;
n_stack++;
}
if (!dfs[w]) {
bicomp(w, v);
/* back up from recursion */
if (back[w] >= dfs[v]) {
/* new bicomponent */
count = 0;
while (v_stack[n_stack - 1] != v || w_stack[n_stack - 1] != w) {
//assert(n_stack > 0);
printf("%d %d\n", v_stack[n_stack - 1],
w_stack[n_stack - 1]);
n_stack--;
count++;
}
printf("%d %d\n", v_stack[n_stack - 1], w_stack[n_stack - 1]);
if (count == 0) {
/* we have a bicomponent containing only one edge */
printf("%d %d\n", w_stack[n_stack - 1],
v_stack[n_stack - 1]);
}
n_stack--;
} else {
back[v] = min(back[v], back[w]);
}
} else {
/* w has been examined already */
back[v] = min(back[v], dfs[w]);
}
}
}
void
do_case(void)
{
int i;
n_stack = 0;
dfn = 0;
for (i = 1; i <= n; i++) {
dfs[i] = 0;
}
bicomp(1, -1);
}
int
main(void)
{
int case_no = 1;
while (read_case()) {
printf("%d\n\n", case_no++);
do_case();
printf("#\n");
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator