Pagini recente » Cod sursa (job #1355916) | Cod sursa (job #2793281) | Cod sursa (job #1467467) | Cod sursa (job #1335822) | Cod sursa (job #371112)
Cod sursa(job #371112)
/**
* Algoritmul lui Kosaraju
*
* parcurg in adancime graful si determin timpii finali ai nodurilor
* construiesc graful trasnpus
* parcurg graful transpus in ordinea data de timpii finali. Fiecare arbore de parcurgere reprezinta o componenta tare conexa
*
*
*/
#include <cstdio>
using namespace std;
#define MAX 100010
struct nod{
int info;
nod * next;
};
nod * G[MAX], * GT[MAX], *CTC[MAX];
int v[MAX], n, nrc, final[MAX], timp, vt[MAX];
void read(){
freopen("ctc.in","r",stdin);
int m , i , j;
nod * p;
scanf("%d%d", &n , &m);
for(i = 1;i<=n;i++)
G[i] = GT[i] = CTC[i] = NULL;
for( ; m ;--m){
scanf("%d%d", &i ,&j);
p= new nod ; p->info = j; p->next = G[i]; G[i] = p; // graful dat
p= new nod ; p->info = i; p->next = GT[j]; GT[j] = p;//graful transpus
}
}
void write(){
freopen("ctc.out","w", stdout);
printf("%d\n", nrc);
for(int i=1;i<=nrc;i++){
for(nod * p = CTC[i]; p ; p=p->next)
printf("%d ", p->info);
printf("\n");
}
}
void dfs(int varf){//parcurgerea grafului dat, cu determinarea timpilor finali
v[varf]=1;
for(nod *p = G[varf]; p ; p = p -> next)
if(!v[p->info])
dfs(p->info);
final[++timp] = varf;
}
void dfst(int x, int nrc){//parcurgerea grafului transpus, cu marcarea componentei tare conexe
vt[x]=nrc;
nod * p = new nod;
p -> info = x;
p->next = CTC[nrc];
CTC[nrc] = p;
for(p = GT[x] ; p ; p = p->next)
if(vt[p->info] ==0)
dfst(p->info, nrc);
}
void kosaraju(){
for(int i =1 ; i<=n;i++)
if(v[i]==0)
dfs(i);
for(int i=timp;i;i--)
if(vt[final[i]]==0)
dfst(final[i], ++nrc);
}
int main(){
read();
kosaraju();
write();
return 0;
}