题目:判断有向图中是否有环
问题描述
判断有向图中是否有环。
输入格式
输入数据第一行是一个正整数,表示n个有向图,其余数据分成n组,每组第一个为一个整数,表示图中的顶点个数n,顶点数不超过100,之后为有向图的邻接矩阵。
输出格式
输出结果为一行,如果有环,则输出1,如果无环,则输出0。按顺序输出这n个有向图的判断结果,前后结果的输出不加空格。
样例输入
3
2
0 1
0 0
3
0 1 1
0 0 0
0 0 0
4
0 1 0 0
0 0 0 1
0 0 0 1
1 0 0 0
样例输出
001
思路:DFS PLUS 如果遍历到之前遍历过且还在这一轮遍历中的结点 一定是有环!
但不知道为啥一直50分呜呜呜呜
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE 100
int juzhen[MAXSIZE][MAXSIZE]={0};
int visited[MAXSIZE]={0};
int visited2[MAXSIZE]={0};//说明当前顶点在栈中
int count = 0;//有环不为0
int num[MAXSIZE]={0}; //存储是否有环
int times = 0;
void DFS(int i,int m){
int j;
visited[i]=1;
visited2[i]=1;
for(j=0;j<m;j++){
if(visited[j]==0&&juzhen[i][j]!=0){
DFS(j,m);
}else if(visited[j]==1&&juzhen[i][j]!=0&&visited2[j]==1&&i!=j){
count++;
}
}
}
void visited2T0(){
int i;
for(i=0;i<MAXSIZE;i++){
visited2[i]=0;
}
}
void DDFS(int m){
int i = 0;
for(i=0;i<MAXSIZE;i++){
visited[i]=0; //初始化
}
for(i=0;i<m;i++){
visited2T0();
if(visited[i]==0){
DFS(i,m);
}
if(count!=0){
break;
}
}
}
void IfEXist(){
int i,j,m;
count=0; //清零
scanf("%d",&m);
for(i=0;i<m;i++){
for(j=0;j<m;j++){
scanf("%d",&juzhen[i][j]);
}
}
DDFS(m);
if(count==0){
num[times]=0;
}else{
num[times]=1;
}
times++;
}
void ToZero(){
int i,j;
for(i=0;i<MAXSIZE;i++){
for(j=0;j<MAXSIZE;j++){
juzhen[i][j]=0;
}
}
}
int main(){
int a,b;
int i,j,k;
int n;
scanf("%d",&n);
for(i=0;i<n;i++){
ToZero();
IfEXist();
}
for(i=0;i<n;i++){
printf("%d",num[i]);
}
return 0;
}