Pagini recente » Cod sursa (job #1108234) | Cod sursa (job #2907776) | Cod sursa (job #1456019) | Cod sursa (job #1540598) | Cod sursa (job #314285)
Cod sursa(job #314285)
#include <stdio.h>
#define MaxN 13
struct vert {
int inf;
vert *next;
};
vert *g[MaxN], *gT[MaxN], *lista[MaxN];
int s[MaxN], n, m, current,elem;
int viz1[MaxN];
int viz2[MaxN];
FILE *fin = fopen("ctc.in","r");
FILE *fout = fopen("ctc.out","w");
void add(int x, int val){
vert *p = new vert;
p->inf = val;
p->next = lista[x];
lista[x] = p;
};
void add_vertex(int v1, int v2){ //add vertex connected from v1 to v2, to graph g;
vert *p = new vert;
p->inf = v2;
p->next = g[v1];
g[v1] = p;
};
void add_tvertex(int v1, int v2){//add vertex connected from v1 to v2, to graph gT;
vert *p = new vert;
p->inf = v2;
p->next = gT[v1];
gT[v1] = p;
};
void read(){
int ex1,ex2;
fscanf(fin,"%d %d", &n, &m);
for (int i = 1; i <= n; i++){
fscanf(fin,"%d %d", &ex1, &ex2);
add_vertex(ex1,ex2);
add_tvertex(ex2,ex1);
};
};
void dfs(int v){
viz1[v] = -1;
for (vert *p = g[v]; p != NULL; p = p->next) {
if (viz1[ p->inf ] == 0)
dfs(p->inf);
};
};
void dfsT(int v){
viz2[v] = -1;
for (vert *p = gT[v]; p!= NULL; p = p->next)
if (viz2[ p->inf ] == 0){
dfsT(p->inf);
}
}
int main(){
read();
current = 0;
for ( int i = 1; elem < n; i++ ){
if (viz1[i] == 0 && i <= n){
current++,dfs(i),dfsT(i);
for (int j = 1; j <= n; j++){
if (viz1[j] == -1 && viz2[j] == -1){
add(i,j);
viz1[j] = current;
viz2[j] = current;
elem++;
} else{
if (viz1[j] == -1) viz1[j] = 0;
if (viz2[j] == -1) viz2[j] = 0;
};
}
}
if (i == n + 1) i = 1;
}
fprintf(fout,"%d\n", current);
bool printed;
for (int i = 1; i <= current; i++){
printed = false;
for ( vert *p = lista[i]; p != NULL; p = p->next)
fprintf(fout,"%d ", p->inf), printed = true;
if (printed)fprintf(fout,"\n");
};
}