这道题我的Tarjan算法哪里错了,求大神指教:题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4324

代码:#include<iostream>#include<string.h>#include<stdio.h>usingnamespacestd;constintN=2... 代码:
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
const int N=2005;
int head[N],low[N],dfn[N],stack[N];
int index,m;
int temp[N];
char str[N][N];
typedef struct
{
int to;
int next;
}Node;
Node map[N*N];
void add(int u,int v)
{
map[index].to=v;
map[index].next=head[u];
head[u]=index++;
}
void Tarbfs(int k,int lay,int &scc_num)
{
temp[k]=1;
low[k]=lay;
dfn[k]=lay;
stack[++m]=k;
for(int i=head[k];i!=-1;i=map[i].next)
{
int t=map[i].to;
if(temp[t]==0)
Tarbfs(t,++lay,scc_num);
if(temp[t]==1)
low[k]=min(low[k],low[t]);
}
if(dfn[k]==low[k])
{
++scc_num;
do
{
low[stack[m]]=scc_num;
temp[stack[m]]=2;
}while(stack[m--]!=k);
}
return;
}
int Tarjan(int n)
{
int scc_num=0,lay=1;
m=0;
memset(temp,0,sizeof(temp));
memset(low,0,sizeof(low));
for(int i=1;i<=n;i++)
if(temp[i]==0) Tarbfs(i,lay,scc_num);
return scc_num;
}
int main()
{
int i,j,n,t=1,T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
memset(dfn,0,sizeof(dfn));
memset(head,-1,sizeof(head));
memset(stack,0,sizeof(stack));
index=0;
for(i=1;i<=n;i++)
scanf("%s",str[i]+1);
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(str[i][j]=='1')
{
add(i,j);
}
}
}
printf("Case #%d: ",t++);
int ret=Tarjan(n);
if(ret>=3) puts("Yes");
else puts("No");
}
return 0;
}
展开
 我来答
ic_windy
2013-07-11 · TA获得超过545个赞
知道小有建树答主
回答量:559
采纳率:0%
帮助的人:611万
展开全部

少了一个函数

int min(int i,int j)

{

if(i<=j) j=i;

return j;

}

还有把最后那里的Yes和No互换就行了,

我在Visual C++上检查还可以,

也通过了OJ,但不够优化

下图第二条记录就是测试数据

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式