锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
/*
2
Problem: 3164 User: _mTy
3
Memory: 872K Time: 172MS
4
Language: C++ Result: Accepted
5
6
Source Code
7
*/
8
#include<cstdio>
9
#include <cstring>
10
#include<cmath>
11
#define MAXN 120
12
#define inf 1000000000
13
typedef double elem_t;
14
elem_t edmonds(int n,elem_t mat[][MAXN*2],int* pre);
15
int main(){
16
elem_t point[MAXN][2];
17
elem_t mat[MAXN*2][MAXN*2];
18
elem_t res,len;
19
int pre[MAXN];
20
int i,j,n,m,u,v;
21
22
while(scanf("%d%d",&n,&m)!=EOF){
23
for(i=0;i<n;i++) for(j=0;j<n;j++) mat[i][j]=inf;
24
for(i=0;i<n;i++) scanf("%lf%lf",&point[i][0],&point[i][1]);
25
for(i=0;i<m;i++){
26
scanf("%d%d",&u,&v); --u; --v;
27
len = pow(point[u][0]-point[v][0],2)+pow(point[u][1]-point[v][1],2);
28
29
len = sqrt(len);
30
mat[u][v]=len;
31
}
32
33
memset(pre,0,sizeof(pre));
34
pre[0]=-1;
35
res = edmonds(n,mat,pre);
36
if(res<0) printf("poor snoopy\n");
37
else printf("%.2f\n",res);
38
}
39
return 0;
40
}
41
42
//澶氭簮鏈灝忔爲褰㈠浘,edmonds綆楁硶,閭繪帴闃靛艦寮?澶嶆潅搴(n^3)
43
//榪斿洖鏈灝忕敓鎴愭爲鐨勯暱搴?鏋勯犲け璐ヨ繑鍥炶礋鍊?br>44
//浼犲叆鍥劇殑澶у皬n鍜岄偦鎺ラ樀mat,涓嶇浉閭葷偣杈規潈inf
45
//鍙洿鏀硅竟鏉冪殑綾誨瀷,pre[]榪斿洖鏍戠殑鏋勯?鐢ㄧ埗緇撶偣琛ㄧず
46
//浼犲叆鏃秔re[]鏁扮粍娓呴浂,鐢?1鏍囧嚭婧愮偣
47
48
elem_t edmonds(int n,elem_t mat[][MAXN*2],int* pre){
49
elem_t ret=0;
50
int c[MAXN*2][MAXN*2],l[MAXN*2],p[MAXN*2],m=n,t,i,j,k;
51
for (i=0;i<n;l[i]=i,i++);
52
do{
53
memset(c,0,sizeof(c)),memset(p,0xff,sizeof(p));
54
for (t=m,i=0;i<m;c[i][i]=1,i++);
55
for (i=0;i<t;i++)
56
if (l[i]==i&&pre[i]!=-1){
57
for (j=0;j<m;j++)
58
if (l[j]==j&&i!=j&&mat[j][i]<inf&&(p[i]==-1||mat[j][i]<mat[p[i]][i]))
59
p[i]=j;
60
if ((pre[i]=p[i])==-1)
61
return -1;
62
if (c[i][p[i]]){
63
for (j=0;j<=m;mat[j][m]=mat[m][j]=inf,j++);
64
for (k=i;l[k]!=m;l[k]=m,k=p[k])
65
for (j=0;j<m;j++)
66
if (l[j]==j){
67
if (mat[j][k]-mat[p[k]][k]<mat[j][m])
68
mat[j][m]=mat[j][k]-mat[p[k]][k];
69
if (mat[k][j]<mat[m][j])
70
mat[m][j]=mat[k][j];
71
}
72
c[m][m]=1,l[m]=m,m++;
73
}
74
for (j=0;j<m;j++)
75
if (c[i][j])
76
for (k=p[i];k!=-1&&l[k]==k;c[k][j]=1,k=p[k]);
77
}
78
}
79
while (t<m);
80
for (;m-->n;pre[k]=pre[m])
81
for (i=0;i<m;i++)
82
if (l[i]==m){
83
for (j=0;j<m;j++)
84
if (pre[j]==m&&mat[i][j]==mat[m][j])
85
pre[j]=i;
86
if (mat[pre[m]][m]==mat[pre[m]][i]-mat[pre[i]][i])
87
k=i;
88
}
89
for (i=0;i<n;i++)
90
if (pre[i]!=-1)
91
ret+=mat[pre[i]][i];
92
return ret;
93
}
]]>
/*
2
Problem: 1679 User: _mTy
3
Memory: 760K Time: 16MS
4
Language: G++ Result: Accepted
5
6
Source Code
7
*/
8
9
#include<cstdio>
10
#include<cstdlib>
11
#include<cstring>
12
#include<queue>
13
#define N 101
14
using namespace std;
15
16
struct nod{
17
int u,max;
18
};
19
int g[N][N];
20
int tree[N][N];
21
int best[N][N];
22
23
int prim(int n,int fa[]);
24
25
int main(){
26
int t,n,m;
27
int i,j,u,v,w,t1,total;
28
int fa[N];
29
struct nod tmp,arr[N*N];
30
bool unique,visi[N];
31
scanf("%d",&t);
32
while(t--){
33
scanf("%d%d",&n,&m);
34
for(i=0;i<n;i++) for(j=0;j<n;j++) g[i][j]=0x7fffffff;
35
memset(tree,-1,sizeof(tree));
36
for(i=0;i<m;i++){
37
scanf("%d%d%d",&u,&v,&w);
38
g[u-1][v-1]=g[v-1][u-1]=w;
39
}
40
t1=prim(n,fa);
41
for(i=0;i<n;i++) tree[i][fa[i]]=tree[fa[i]][i]=g[i][fa[i]];
42
43
// bfs
44
total=0;
45
memset(best,-1,sizeof(best));
46
for(i=0;i<n;i++){
47
memset(visi,0,sizeof(visi));
48
arr[total].u=i; arr[total].max=-1;
49
queue<struct nod> _que; _que.push(arr[total]); ++total;
50
visi[i]=1;
51
while(!_que.empty()){
52
tmp = _que.front(); _que.pop();
53
for(v=0;v<n;v++)
54
if( !visi[v] && tree[tmp.u][v]!=-1 ){
55
visi[v]=1;
56
best[i][v]=
57
(tmp.max<tree[tmp.u][v])?tree[tmp.u][v]:tmp.max;
58
arr[total].max=best[i][v];
59
arr[total].u=v;
60
_que.push(arr[total]);
61
++total;
62
}
63
}
64
}
65
unique = 1;
66
for(i=0;i<n;i++)
67
for(j=i+1;j<n;j++)
68
if( g[i][j]!=0x7fffffff && tree[i][j]==-1 )
69
if( t1 - best[i][j] + g[i][j] == t1 ) unique = 0;
70
71
if( unique ) printf("%d\n",t1);
72
else printf("Not Unique!\n");
73
74
}
75
76
return 0;
77
}
]]>
/**//*Source Code
2
3
Problem: 2777 User: _mTy
4
Memory: 4024K Time: 329MS
5
Language: C++ Result: Accepted
6
7
*/
8
#include<stdio.h>
9
#include<string.h>
10
#define MAXV 666666
11
#define swap(a,b) a^=b^=a^=b
12
13
typedef unsigned long _UL;
14
typedef _UL ele_t;
15
ele_t data[MAXV];
16
int B[MAXV],E[MAXV],LSON[MAXV],RSON[MAXV],C[MAXV];
17
int cnt;
18
bool fill[MAXV];
19
// B[] E[] 瀛樻斁 [a,b]宸︾晫 鍙崇晫
20
// C[] 瑕嗙洊褰撳墠鍖洪棿鐨勭嚎孌墊暟
21
// LSON,RSON 鐐箆鐨勫乏鍙沖効瀛愮殑鏁扮粍涓嬫爣
22
// fill[] 鎸囩ず鐗瑰畾鍖洪棿鏄惁浠呰涓縐嶉鑹插~鍏?/span>
23
24
void ini(int u,int v)
{
25
int i;
26
++cnt; i = cnt; B[i] = u; E[i] = v;
27
if( v - u >= 1 )
{
28
LSON[i] = cnt+1; ini(u,(u+v)/2);
29
RSON[i] = cnt+1; ini((u+v)/2+1,v);
30
}
31
}
32
33
void insert(int u,int v,int r,ele_t ele)
{ // 灝嗗尯闂碵u,v]淇℃伅 data 鎻掑叆浠?nbsp;r 涓烘牴鐨勭嚎孌墊爲
34
if( u <= B[r] && v >= E[r] )
{
35
data[r] = 1UL<<ele-1;
36
fill[r] = 1;
37
}else
{
38
if( fill[r] == 1 )
{ data[LSON[r]] = data[RSON[r]] = data[r]; fill[LSON[r]] = fill[RSON[r]] = 1; }
39
40
if( u <= (B[r]+E[r])/2 ) insert(u,v,LSON[r],ele);
41
if( v >= (B[r]+E[r])/2+1 ) insert(u,v,RSON[r],ele);
42
43
// updata [u,v]
44
data[r] = data[LSON[r]] | data[RSON[r]];
45
fill[r] = 0;
46
}
47
}
48
49
_UL out(int u,int v,int r)
{
50
int data_1 = 0,data_2 = 0;
51
if( fill[r] == 1 || u <= B[r] && v >= E[r] ) return data[r];
52
else
{
53
if( u <= (B[r]+E[r])/2 ) data_1 = out(u,v,LSON[r]);
54
if( v >= (B[r]+E[r])/2+1 ) data_2 = out(u,v,RSON[r]);
55
return data_1 | data_2;
56
}
57
}
58
59
int main()
{
60
int i,j,l,t,o,u,v,cc,res;
61
_UL val;
62
char chr;
63
while(scanf("%d%d%d",&l,&t,&o)!=EOF)
{
64
getchar();
65
66
data[1] = 1UL;
67
cnt = 0; ini(1,l);
68
memset(fill,0,sizeof(bool)*(cnt+1)); fill[1] = 1; // 鍒濆鍖洪棿 [u,v] 琚?棰滆壊濉厖
69
70
for(i=0;i<o;i++)
{
71
scanf("%c%d%d",&chr,&u,&v);
72
if( u>v ) swap(u,v);
73
if( chr == 'C' )
{
74
scanf("%d",&cc);
75
getchar();
76
insert(u,v,1,cc);
77
}else
{
78
getchar();
79
val = out(u,v,1);
80
res = 0;
81
for(j=0;j<t;j++) if( val & 1UL<< j ) ++res;
82
printf("%d\n",res);
83
}
84
}
85
}
86
return 0;
87
}
]]>
// HelloOpencv.cpp : 瀹氫箟鎺у埗鍙板簲鐢ㄧ▼搴忕殑鍏ュ彛鐐廣?/span>
2
3
#include "stdafx.h"
4
#include"cxcore.h"
5
#include "highgui.h"
6
#include<math.h>
7
using namespace cv;
8
using namespace std;
9
10
int _tmain(int argc, _TCHAR* argv[])
11

{
12
CvPoint center;
13
double scale = -3;
14
IplImage* image = (argc == 2 )? cvLoadImage(argv[1]) : 0;
15
if( ! image ) return -1;
16
center = cvPoint( image->width/2 , image->height/2 );
17
for( int i = 0; i<image->height; i++ )
18
for( int j = 0; j<image->width; j++ )
{
19
double dx = ( double )( j-center.x )/center.x;
20
double dy = ( double )( i-center.y )/center.y;
21
double wight = exp( (dx*dx+dy*dy)*scale );
22
uchar* ptr = &CV_IMAGE_ELEM( image, uchar, i, j*3 );
23
ptr[0] = cvRound(ptr[0]*wight);
24
ptr[1] = cvRound(ptr[1]*wight);
25
ptr[2] = cvRound(ptr[2]*wight);
26
}
27
cvSaveImage("new.png",image);
28
cvNamedWindow("_椋炲瘨銇?nbsp;TEST",1);
29
cvShowImage("_椋炲瘨銇?nbsp;TEST",image);
30
cvWaitKey();
31
return 0;
32
}
33
34
鏁堟灉濡備笅錛?br>
]]>
1. 涓嬭澆瀹夎OpenCV2.2鍒頒換鎰忚タ鏂囪礬寰勩?br>
2. 涓嬭澆瀹夎 CMake 2.8 錛屽畨瑁呭悗鐢ㄤ簬瀵煎嚭CV鐨刢++欏圭洰鏂囦歡銆?br> http://www.cmake.org/cmake/resources/software.html
(1) 濡傚浘鎵紺?閫夋嫨緙栬瘧璧勬簮錛屽拰緙栬瘧鍚庣粨鏋滅殑淇濆瓨璺緞(濡?F:\OpenCV2.2\vc2008 )銆傜偣鍑?span class=Apple-style-span style="WORD-SPACING: 0px; FONT: medium Simsun; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px">configure錛岄厤緗負 VS 9 2008錛岄厤緗棤璇悗鐐瑰嚮Generate鐢熸垚鍚勭宸ョ▼鏂囦歡銆?br>

(2) 鍦ㄧ紪璇戠粨鏋滅殑鏂囦歡澶瑰唴鐢熸垚OpenCV.sln鐨刅C Solution File錛岃鐢╒S 2008 鎵撳紑OpenCV.sln, 鐒跺悗鍏ㄩ儴緙栬瘧錛屾棤璇悗鎵圭敓鎴愭墍鏈塃XAMPLE銆?br>
鑷蟲錛孫penCV鐨?d.dll鏂囦歡錛坒or debug錛夊拰*.dll鏂囦歡錛坒or release錛夊皢鍑虹幇鍦?\vs2008\bin 鐩綍涓紱OpenCV鐨?d.lib鏂囦歡錛坒or debug錛夊拰*.lib鏂囦歡錛坒or release錛夊皢鍑虹幇鍦╘vs2008\lib 鐩綍錛涘ご鏂囦歡*.h鍑虹幇鍦?vs2008\include\opencv2涓傚彲浠ヨ VS 2008 璋冪敤鐨凮penCV鍔ㄦ佸簱
(5) 閰嶇疆緋葷粺鐜鍙橀噺 灝?..\vs2008\bin鍔犲叆Windows緋葷粺鐜鍙橀噺Path涓紝鍙兘瑕侀噸鍚?br>
(6) 涓篤S2008閰嶇疆 OpenCV鐜錛佸鍥撅紝閰嶇疆CV紼嬪簭鍙兘闇瑕佺殑搴撴枃浠跺拰澶存枃浠躲傚埌浜嗚繖涓姝ラ棶棰樼粓浜庡嚭鐜頒簡錛屾寜鐓V涓枃绔欎笂鐨勫畨瑁呮暀紼嬪畨瑁呯殑璇濓紝VS姝婚兘鎻愮ず xxx.h 鏂囦歡鏃犳硶鎵懼埌銆傜粡榪囧鐣懜绱紝鏈鍚庢槸紜畾鏂囦歡緇撴瀯閫犳垚鐨勯棶棰樸?br>
棣栧厛錛屽畬鍏ㄧ敓鎴怬penCV.sln鍐呯殑浠g爜鍚庯紝\vs2008\include 鍜?\vs2008\lib 鍐呬細鍑虹幇鐩稿簲鐨勬枃浠訛紝.lib鏂囦歡鐨勮礬寰?nbsp; xxx\vs2008\lib 鍙渶鎸夌収鏁欑▼鐩存帴娣誨姞鍗沖彲銆?br>浣嗘槸include鏂囦歡鍒欎笉鍚岋紝鍦?.1鍙婂叾浠ヤ笅鐗堟湰涓殑鏂囦歡緇勭粐鏂瑰紡涓嶅悓錛?.2涓敱浜庝竴浜涢噸澶ф洿鏂幫紝鍦╫pencv鏂囦歡澶瑰悓綰х洰褰曚笅鎷ユ湁opencv2鏂囦歡澶?鏈嬌鐢╒S08鎵圭敓鎴愪箣鍓?錛屾墍鏈夌浉搴旂殑澶存枃浠跺叾瀹為兘宸茬粡榪佸叆鍏朵腑錛屼繚鐣檕pencv鏂囦歡澶圭殑鐩殑鏄負浜嗗悜涓嬪吋瀹癸紝鎵撳紑opencv鏂囦歡澶歸噷鐨勪換鎰忓ご鏂囦歡錛屾垜浠彂鐜頒唬鐮佸澶ц嚧鏈?
#ifndef __OPENCV_OLD_CXCORE_H__
#define __OPENCV_OLD_CXCORE_H__
//#if defined(__GNUC__)
//#warning "This is a deprecated opencv header provided for compatibility. Please include a header from a corresponding opencv module"
//#endif
#include "opencv2/core/core_c.h"
#include "opencv2/core/core.hpp"
#endif
瀹為檯涓婄紪璇戣璺寵漿浜嗭紝浣嗘槸鍥炲埌 \vs2008\inlcude鐩綍涓嬶紝鎯婅鐨勫彂鐜扮敓鎴愮殑緇撴灉浜嬪疄涓婃湭鍖呭惈 opencv鏂囦歡澶癸紒姝ゆ椂濡傛灉浠呬粎鎶?...\vs2008\include\opencv2閰嶇疆錛屽垯vs2008浠嶇劧鏃犳硶瀵煎叆澶存枃浠訛紝姝ゆ椂闇瑕佹墜鍔ㄥ皢 \include\opencv 鐩綍澶嶅埗鍒?\vs2008涓嬶紝鐒跺悗榪藉姞閰嶇疆 ...\vs2008\include\opencv銆傛渶鍚嶧5緙栬瘧錛宐ingo~
涓婇潰榪欐潯琛ㄨ揪寮忓嚭鏉ヤ箣鍚庡氨寰堝鏄撴兂鍒癓IS浜嗭紝涔熷氨鏄灇涓綼i鍜宎i+1鐨勪綅緗紝鐒跺悗宸﹀崐閮ㄥ垎鍜屽張鍗婇儴鍒嗗垎鍒線鐩稿弽鐨勬柟鍚戝仛LIS錛屾眰鍑哄嚭鍒楁暟鏈鐭殑涓涓腑鐐瑰嵆鍙紝鍏朵腑鍋歀IS鍙互閲囩敤浜屽垎鏌ユ壘錛屼嬌寰楄漿縐昏姳璐逛粠O(n)闄嶄負O(lg n)銆?br>
#include<cstdio>
#include<cstring>
#define inf 0x7fffffff
#define N 1001
#define MAX(a,b) (a<b)?b:a
#define MIN(a,b) (a<b)?a:b
using namespace std;
int lis[N],lds[N];
double w[N];

int find(double c[],int len,double k)
{
int left=0,right=len,mid=(left+right)/2;
while(left<=right)
{
if( k>c[mid] ) left=mid+1;
else if( k<c[mid] ) right=mid-1;
else
{ return mid; }
mid=(left+right)/2;
}
return left;
}

int main()
{
int n,i,j,res;
int tmpDp[N];
double c[N];
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++) scanf("%lf",&w[i]);
for(i=0;i<=n;i++) c[i]=inf;
c[0]=-1; c[1]=w[n-1];
memset(tmpDp,0,sizeof(tmpDp));
tmpDp[n-1]=1;
for(i=n-2;i>-1;--i)
{
j=find(c,n+1,w[i]);
c[j]=w[i]; tmpDp[i]=j;
}
for(j=-1,i=n-1;i>-1;--i)
{ j=MAX(j,tmpDp[i]); lds[i]=j; }
for(i=0;i<=n;i++) c[i]=inf;
c[0]=-1; c[1]=w[0];
memset(tmpDp,0,sizeof(tmpDp));
tmpDp[0]=1;
for(i=1;i<n;++i)
{
j=find(c,n+1,w[i]);
c[j]=w[i]; tmpDp[i]=j;
}
for(j=-1,i=0;i<n;++i)
{ j=MAX(j,tmpDp[i]); lis[i]=j; }
res=inf;
for(i=0;i<n;++i)
{
res=MIN(res,n-(lis[i]+lds[i+1]));
}
printf("%d\n",res);
}
return 0;
}
#include<iostream>
#include<cstring>
using namespace std;
#define MIN(a,b) (a<b)?a:b
#define L 301
#define W 601
int dp[L];
int lenArr[W];
char sourc[L+1];
char dic[W][27];
int main()
{
int i,j,k;
int l,w;
int souPoi,dicPoi,cnt;
while(cin>>w>>l)
{
cin>>sourc;
for(i=0;i<w;i++)
{ cin>>dic[i]; lenArr[i]=strlen(dic[i])-1; }
for(i=0;i<=l;i++) dp[i]=0x7fffffff;
dp[0]=0;
for(i=1;i<=l;i++)
{
for(j=0;j<w;j++)
{
dicPoi=lenArr[j];
souPoi=i-1;
cnt=0;
/**//* 鍊掗鍖歸厤錛岃嫢褰撳墠涓嶅尮閰嶏紝鍒欏皾璇曞垹鍘諱竴涓瓧絎?nbsp;*/
while( souPoi>-1 && dicPoi>-1 )
{
if( sourc[souPoi] == dic[j][dicPoi] )
{ --souPoi; --dicPoi; }
else
{ ++cnt; --souPoi; }
}
if( dicPoi<0 )
{ dp[i]=MIN(dp[i],dp[i-(cnt+lenArr[j]+1)]+cnt); }
else
{ dp[i]=MIN(dp[i],dp[i-1]+1); } /**//* 鍖歸厤澶辮觸 */
}
}
printf("%d\n",dp[l]);
}
return 0;
}銆 榪欐槸SCC闂鐨勭涓涓畻娉曪紝鐢盩arjan浜?972騫存彁鍑恒傜畻娉曚粛鐒跺熷姪DFS錛屼絾瀹冨茍涓嶄緷闈犻亶鍘嗛『搴忔潵鎶婁笉鍚岀殑SCC鍒嗙鍒頒笉鍚岀殑DFS鏍戜腑錛岃屾槸璁╁涓猄CC騫跺瓨浜庡悓涓涓狣FS鏍戜腑錛岀敤鏌愮鎵嬫鎶婁粬浠垎寮銆傝冭檻涓涓己鍒嗛噺C錛岃鍏朵腑絎竴涓鍙戠幇鐨勭偣涓簒錛岀敱鐧借礬寰勫畾鐞嗭紝C涓叾浠栫偣閮芥槸x鐨勫悗浠c傛垜浠笇鏈涘湪x璁塊棶瀹屾垚鏃剁珛鍒昏緭鍑篊銆?娉ㄦ剰榪欓噷鏄竴涓弗鏍肩殑鏁板鎻忚堪)銆傝繖鏍鳳紝灝卞彲浠ュ湪鍚屼竴媯礑FS鏍戜腑鍖哄垎寮鎵鏈夌殑SCC浜嗐傚洜姝ら棶棰樼殑鍏抽敭鏄細濡備綍鍒ゆ柇涓涓偣鏄惁涓篠CC涓渶鍏堣鍙戠幇鐨勭偣銆?br>銆
銆 濡傚浘銆?img style="WIDTH: 384px; HEIGHT: 259px" border=0 alt=dfs鏍?align=right src="http://m.shnenglu.com/images/cppblog_com/mtysblog/Tarjan.jpg" width=384 height=259>鍋囪鎴戜滑姝e湪鍒ゆ柇u鏄惁涓烘煇SCC涓涓涓鍙戠幇鐨勮妭鐐廣傚鏋滄垜浠彂鐜頒粠u鐨勫効瀛愬嚭鍙戝彲浠ュ埌杈緐鐨勭鍏坵,鏄劇劧u\v\w鍦ㄥ悓涓涓猄CC涓紝鍥犳u涓嶆槸璇CC絎竴涓鍙戠幇鐨勮妭鐐廣傚鏋滀粠v鍑虹幇鏈澶氬彧鑳藉埌u錛岄偅涔坲鏄SCC涓涓涓鍙戠幇鐨勮妭鐐癸紙涔熻鏈夊悓瀛︿細闂紝鑻ユ墍鏈夊瓙鑺傜偣涓嶈兘鍒拌揪u鏈韓錛屼綍浠ヨ兘璇存槑u鏄拰瀛愭爲寮鴻仈閫氱殑錛熷叾瀹炵敱浜嶥FS鐨勭壒鐐癸紝鑻ヨ繖鏍風殑鎯呭喌鍑虹幇錛屽疄闄呬笂鍦╱鐨勫瓙鏍戜笂宸茬粡瀹屾垚浜嗕竴涓己鍒嗛噺鐨勫鎵撅紝u姝ゆ椂鏄彧鍒板畠鏈韓鐨?#8220;絎竴涓?#8221;琚彂鐜拌妭鐐癸紝鍘熶功鐨勬弿榪版槸涓ユ牸鍜屽綊綰崇殑錛夈傝繖鏍鳳紝闂杞寲涓烘眰錛氫竴涓偣u鏈榪滆兘鍒拌揪鐨勭鍏堢殑d鍊箋傛敞鎰忚繖閲岀殑“鍒拌揪”鍙互閫氳繃鍚庡悜杈規垨浜ゅ弶杈癸紝浣嗘槸鍓嶆彁鏄彧鑳介氳繃鏍堥噷闈㈢殑鐐硅屼笉鏄凡緇忕‘瀹歋CC緙栧彿鐨勫叾浠栫偣銆傚浘涓疄綰胯〃紺轟竴鏉¤竟錛岃櫄綰胯〃紺轟竴鏉℃垨澶氭潯杈廣?br>
瀹氫箟low[u]涓簎鍙婂叾鍚庝唬鑳借拷婧埌鐨勬渶鏃╃鍏坴鐨勫彂鐜版椂闂存埑pre[v]錛屾垜浠彲浠ュ湪璁$畻low鍑芥暟鐨勫悓鏃跺畬鎴怱CC鐨勮綆楋紝low鍑芥暟鐨勯掓帹鏂規硶濡備笅錛?br> 鍒╃敤鍏ㄥ眬鏍坃sta淇濆瓨褰撳墠SCC涓殑鑺傜偣錛堟敞鎰忔爤涓妭鐐瑰艦鎴愭爲鑰屼笉涓瀹氭槸閾撅級錛宑nt涓哄紑鍙戝綋鍓嶇偣u鐨勬椂闂存埑錛宻cnt涓哄己鍒嗛噺緙栧彿鍣紝id[]涓哄己鍒嗛噺緙栧彿鏁扮粍銆?br>
鍘熷鐨凾arjan綆楁硶閫掓帹鏂瑰紡涓猴細濡傛灉 pre[w]<pre[u]涓攚鍦ㄦ爤涓紝鍒檒ow[u]=min{pre[w],low[u]}錛屾敞鎰忓悗涓涓檺鍒舵槸涓轟簡淇濊瘉w涓嶆槸鍦ㄥ彟涓涓凡緇忓彂鐜扮殑SCC涓備笅闈㈢殑浠g爜鏇寸畝媧侊紝鍦ㄦ爣璁板己鍒嗛噺鍚庯紝鍙渶瑕佸皢low[w]璁句負鏈澶у鹼紝琛ㄦ槑瀹冧笉鍐嶆槸浠諱綍鐐圭殑紲栧厛錛岄偅涔坵灝變笉浼氳鍏朵粬寮哄垎閲忓惛鏀朵簡錛屾兂鎯充負浠涔堛?br>

void dfs-scc(int u)
{
int w,min;
min=low[u]=pre[u]=cnt++;
/**//* 鍒濆鍖栨椂闂存埑錛宭ow鍊鹼紝瀛愯妭鐐規渶灝忕鍏?nbsp;涓哄綋鍓嶆椂闂存埑 */
_sta.push(u);

for each (u,w)
{
if(pre[w]==-1) dfs-scc(w);
/**//* 鏈紑鍙戣妭鐐?nbsp;*/
if( low[w]<min ) min=low[w];
/**//* 姹傚嚭u鎵鏈夊効瀛恑鏈榪滆兘鍒拌揪鐨勭鍏?nbsp;*/
}

if(min<low[u])
{ low[u]=min; return ; }
/**//* 鎵鏈夌殑鍎垮瓙鑳藉埌杈劇殑鏈榪滅鍏堟槸u鐨勭鍏堬紝鍥犳u涓嶆槸SCC
絎竴涓鍙戠幇鐨勮妭鐐癸紝閫氳繃瀛愯妭鐐癸紝u搴旇兘鍒拌揪榪欐牱鐨勭涓涓妭鐐?nbsp;*/
do
{
w=_sta.pop(w);
id[w]=scant;
low[w]=0x7fffffff; /**//* 閿佸畾low錛屼繚璇亀涓嶄細琚叾浠栧己鍒嗛噺鍚告敹 */
}while(w!=u)
/**//* 姝ゆ椂錛寀鐨勬墍鏈夊瓙鑺傜偣蹇呰兘涓旀渶榪滀粎鑳藉埌杈緐錛屼粬浠矡閫氭瀯鎴愪竴涓猄CC */
scant++;
}