SCC重新建图

Tarjan或Kosaraju算法【对每个点归类belong】求出SCC之后,对num_scc个SCC重新建图,针对不同问题,考虑重边的问题。

 1 //**************************************重构图****************************************//
 2 void init_rebuild(void)
 3 {
 4     rebuild_ALG->n=num_scc;
 5     for(int i=1;i<=num_scc;i++)
 6     {
 7         rebuild_ALG->vlist[i].vertex=i;
 8         rebuild_ALG->vlist[i].firstedge=NULL;
 9 
10         in_d[i]=0;
11         out_d[i]=0;
12     }
13 }
14 
15 void add_edge_To_ALG(int par,int son)
16 {
17     ENode *ptr=(ENode *)malloc(sizeof(ENode));
18 
19     ptr->key=son;
20     ptr->next=rebuild_ALG->vlist[par].firstedge;
21     rebuild_ALG->vlist[par].firstedge=ptr;
22 }
23 
24 void rebuild_ALGraph(void)
25 {
26     int par,son;
27     int in_par_scc;  //判断是否已在par的scc中
28     ENode *ptr=(ENode *)malloc(sizeof(ENode));
29     ENode *ep=(ENode *)malloc(sizeof(ENode));
30 
31     for(int i=0;i<ALG->n;i++)
32     {
33         par=i;
34         in_par_scc=0;
35         ptr=ALG->vlist[par].firstedge;
36         while(ptr!=NULL)
37         {
38             son=ptr->key;
39             if(belong[par] != belong[son])
40             {
41                 ep=rebuild_ALG->vlist[belong[par]].firstedge;//考虑重边问题
42                 while(ep!=NULL)
43                 {
44                     if(ep->key == belong[son])
45                     {
46                         in_par_scc=1;
47                         break;
48                     }
49                     ep=ep->next;
50                 }
51                 if(!in_par_scc)
52                 {
53                     add_edge_To_ALG(belong[par],belong[son]);
54                     in_d[belong[son]]++;
55                     out_d[belong[par]]++;
56                 }
57             }
58             ptr=ptr->next;
59         }
60     }
61 }
62 //***************************************************************************//
---  纵使山重水复,亦会柳暗花明   sunqh1991@163.com   欢迎关注,互相交流
原文地址:https://www.cnblogs.com/wjcx-sqh/p/5929923.html