DFS做小希的迷宫(图论)

第一次学习写DFS,什么都不会,只能写出这些东西,大牛见了还请批评指正!

// 小希的迷宫.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include <iostream>
#include <stdio.h>
using namespace std;
struct Edge//用结构体存储边信息,flag表示该边是否被选取。
{
	int v1,v2;
	int flag;
}edge[1000];
int v[100001];
int visited;
void dfs(Edge *edge,int v,int size)
{
	for(int i=0;i<size;i++)
	{
		if(visited>=size)
			break;
		if(edge[i].v1==v && edge[i].flag==0)
		{
			edge[i].flag=1;
			visited++;
			dfs(edge,edge[i].v2,size);
		}
		if(edge[i].v2==v && edge[i].flag==0)
		{
			edge[i].flag=1;
			visited++;
			dfs(edge,edge[i].v1,size);
		}
	}
}
int main()
{
	int m,n;
	while(cin>>m>>n)
	{
		if(m==-1 && n==-1)
			return 0;
		if(m==0 && n==0)//判断特殊情况:开始就输入两个0
			cout<<"Yes\n";
		else
		{
			int loop=0;
			int size_v=0,size_e=0,symbol=0,max_v;//max_v用来存储点的最大编号
			visited=0;
			memset(v,0,sizeof(v));
			max_v=(m>=n)?m:n;
			for(int i=0;i<1000;i++)//初始化结构体
			{
				edge[i].flag=0; 
			}
			edge[0].v1=m; edge[0].v2=n;
			v[m]=1;v[n]=1;
			size_e++;
			while(cin>>m>>n,m!=0 || n!=0)
			{
				edge[size_e].v1=m; 
				edge[size_e++].v2=n;
				v[m]=1;v[n]=1;
				if(m>max_v)
					max_v=m;
				if(n>max_v)
					max_v=n;
			}
			for(int i=1;i<=max_v;i++)//统计顶点的个数
				if(v[i]==1)
					size_v++;
			dfs(edge,edge[0].v1,size_e);//深搜只是标记是否是连通图。
			for(int i=0;i<size_e;i++)//判断图是否连通
			{
				if(edge[i].flag==0)//不连通
				{
					symbol=1;
					break;
				}
			}
			if(symbol==1)
				cout<<"No\n";
			else
			{
				if(size_e>=size_v)//判断是否有环:某一个连通分支的边数>=该分支的顶点数,则有环。
					cout<<"No\n";
				else
					cout<<"Yes\n";
			}
		}
	}
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值