| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
无限郁闷的题目。。。难道是我的tarjan模板出问题了,至于这么多TLE的啊。。。求大牛指正模板附我的tarjan模板:
#define Min(a,b) a>b?b:a
#define M 5010 //题目中可能的最大点数
int STACK[M],top=0; //Tarjan 算法中的栈
bool InStack[M]; //检查是否在栈中
int DFN[M]; //深度优先搜索访问次序
int Low[M]; //能追溯到的最早的次序
int cnt=0; //有向图强连通分量个数
int Index=0; //索引号
vector <int> Edge[M]; //图用邻接表表示
int belong[M]; //记录每个点在第几号强连通分量里//int ComponentDegree[M]; //记录每个强连通分量的度
void Tarjan(int i){
int j;
DFN[i]=Low[i]=Index++;
InStack[i]=true;
STACK[++top]=i;
for (int e=0;e<Edge[i].size();e++){
j=Edge[i][e];
if (DFN[j]==-1){
Tarjan(j);
Low[i]=Min(Low[i],Low[j]);
}
else if (InStack[j])
Low[i]=Min(Low[i],DFN[j]);
}
if (DFN[i]==Low[i]){ //因为每一个节点的DFN都是唯一的,所以,当DFN[i]=Low[i]时,即又回到原先的点
cnt++;//强连通分量的个数或者说是序号
do{
j=STACK[top--];
InStack[j]=false;
belong[j]=cnt;
}while(j!=i);
}
}
void solve(){
memset(STACK,-1,sizeof(STACK));
memset(InStack,0,sizeof(InStack));
memset(DFN,-1,sizeof(DFN));
memset(Low,-1,sizeof(Low));
for(int i=0;i<N;i++)
if(DFN[i]==-1) Tarjan(i);
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator