Cod sursa(job #718460)

Utilizator costyv87Vlad Costin costyv87 Data 20 martie 2012 20:18:25
Problema Componente biconexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <cstdio>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;
#define nm 100100

FILE *f,*g;
vector <int> sol1, sol2,a[nm];
int mn[nm],lv[nm],bf[nm];
int n,m,lvl;


void read() {
int i,x,y;
f=fopen("pamant.in","r");
g=fopen("pamant.out","w");

fscanf(f,"%d%d",&n,&m);
for (i=1;i<=m;i++) {
	fscanf(f,"%d%d",&x,&y);
	a[x].push_back(y);
	a[y].push_back(x);
	}
}




void df(int x,int t) {
int i,j,st,dr;
lv[x]=mn[x]=++lvl;

for (i=0;i<a[x].size();i++) {
	j=a[x][i];
	if (j==t) continue;
	
	if (lv[j] && lv[j]<lv[x])  mn[x]=min(mn[x],mn[j]);
	
	if (!lv[j]) {
		df(j,x);
		mn[x]=min(mn[x],mn[j]);
		if (mn[j]>=mn[x]) {
			sol2.push_back(x);
			}
		}
		
	}


}


void solve() {
int i;

for (i=1;i<=n;i++) 
	if (!lv[i]) {
		sol1.push_back(i);
		lvl=0;
		df(i,0);
		sol2.pop_back();
		}
}


void write() {
int i;

fprintf(g,"%d\n",sol1.size());
for (i=0;i<sol1.size();i++) fprintf(g,"%d ",sol1[i]);
fprintf(g,"\n");
fprintf(g,"%d\n",sol2.size());
for (i=0;i<sol2.size();i++) fprintf(g,"%d ",sol2[i]);


}

int main () {
read();
solve();
write();

return 0;
}