HDU 3072 图论scc

 1 #include<bits/stdc++.h>
 2 #define INF 0x7fffffff
 3 using namespace std;
 4 const int MAXN = 50010;//点数 
 5 const int MAXM = 100100;//边数 
 6 struct Edge {  
 7     int to,next,val; 
 8 }edge[MAXM]; 
 9 int head[MAXN],tot,a,b; 
10 int Low[MAXN],DFN[MAXN],Stack[MAXN],Belong[MAXN];//Belong数组的值是1~scc 
11 int Index,top; int scc;//强连通分量的个数 
12 int in[MAXN],out[MAXN],val[MAXN],d[MAXN];
13 bool Instack[MAXN]; 
14 int num[MAXN];//各个强连通分量包含点的个数,数组编号1~scc //num数组不一定需要,结合实际情况 
15 int cnt=0,ans=0;
16 void addedge(int u,int v,int w){  
17     edge[tot].to = v;
18     edge[tot].next = head[u];
19     edge[tot].val=w;
20     head[u] = tot++; 
21 } 
22 void Tarjan(int u){
23     int v;  
24     Low[u] = DFN[u] = ++Index; 
25     Stack[top++] = u;  
26     Instack[u] = true;  
27     for(int i = head[u];i != -1;i = edge[i].next) {  
28         v = edge[i].to;   
29         if( !DFN[v] ){
30             Tarjan(v);   
31             if( Low[u] > Low[v] )
32                 Low[u] = Low[v];   
33         }   
34         else if(Instack[v] && Low[u] > DFN[v])
35             Low[u] = DFN[v];  
36         }  
37         if(Low[u] == DFN[u]){ 
38             scc++; 
39             do{    
40                 v = Stack[--top];
41                 Instack[v] = false;    
42                 Belong[v] = scc;    
43                 num[scc]++;   
44             }while( v != u);  
45         } 
46 } 
47 void find_val(int u){
48     int v;
49     for(int i = head[u];i != -1;i = edge[i].next){
50         v = edge[i].to;
51         if(Belong[u]==Belong[v]) continue;
52         val[Belong[v]]=min(val[Belong[v]],edge[i].val);
53         //out[Belong[u]]++;
54     }
55 }
56 void solve(int N){
57     memset(DFN,0,sizeof(DFN));
58     memset(Instack,false,sizeof(Instack));
59     memset(num,0,sizeof(num));  
60     Index = scc = top = 0;  
61     for(int i=1;i<=N;i++) val[i]=INF;
62     for(int i = 1;i <= N;i++)
63         if(!DFN[i])    
64         Tarjan(i); 
65     for(int i=1;i<=N;i++){
66     //    val[Belong[i]]=min(val[Belong[i]],d[i]);
67         find_val(i);
68     }
69     val[Belong[1]]=0;
70     for(int i=1;i<=scc;i++){
71         ans+=val[i];
72     }
73 } 
74 void init(){
75     tot = 0; 
76     cnt=0,ans=0;
77     memset(head,-1,sizeof(head)); 
78     memset(in,0,sizeof(in));
79     memset(out,0,sizeof(out));
80 } 
81 int main(){
82     int n,m,u,v,w,T;
83     while(scanf("%d%d",&n,&m)!=EOF){ 
84         init();
85         //for(int i=1;i<=n;i++) scanf("%d",&d[i]);
86         for(int i=1;i<=m;i++){
87             scanf("%d%d%d",&u,&v,&w);
88             u++,v++;
89             addedge(u,v,w);    
90         }
91         solve(n);
92         cout<<ans<<endl;
93         //cout<<cnt<<' '<<ans<<endl;
94     }
95     return 0;
96 }
原文地址:https://www.cnblogs.com/poler/p/7391111.html