XDOJ 323 判断有向图中是否有环

题目:判断有向图中是否有环

问题描述

判断有向图中是否有环。

输入格式

输入数据第一行是一个正整数,表示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;
}

猜你喜欢

转载自blog.csdn.net/weixin_41673825/article/details/122199233
323