samsung第一次面试题(20180302)

一、题目要求

遍历一个图,输出它的其中一个环。

格式:顶点数    顶点对数

例如:

输入

5 5
4 3 2 4 3 5 3 2 1 4
5 5
4 3 2 4 3 5 2 3 1 4
8 9 

5 2 3 2 6 3 8 7 2 1 6 4 2 4 1 5 7 8

输出

4-3-2-4
0

7-8-7

二、算法(自己写的)

#include<stdio.h>
#define MAX 10
int vertex[MAX];
int adj[MAX][MAX];


int num=0;
int cycle=999;
int AnswerN=0;
int Answer[MAX];
int N,M;
void DFS_cycle(int i)//遍历顶点i
{
	int j,k;
	if(cycle==1 || cycle==0)//若已经知道是否能够成环,则放弃递归遍历
		return ;
	Answer[num]=i;//将正在递归的数i放在数组中
	num++;
	for(j=1;j<N;j++)//遍历顶点为i的邻接节点j
	{
		if(cycle==999)//若还不知道图是否能够形成环
		{
			if(adj[i][j]==1)//若顶点j是顶点i的邻接顶点
			{
				for(k=0;k<num;k++)//判断此时的顶点j是否已经被访问过
				{
					if(Answer[k]==j)//若顶点j和前面数组的数有一个是重复的,说明顶点j已经被访问过
					{
						if(k==0)//若与前面的第一个顶点是一样的,则够成一个环
						{
							Answer[num]=j;
							cycle=1;
							AnswerN=num+1;
							break;
						}
						else
						{
							cycle=0;
							AnswerN=0;
							break;
						}
					}
				}
				if(k==num)
				{
					DFS_cycle(j);
				}
			}
		}
	}
	
}
//fill the adjacent matrix  and call the function of DFS_cycle
int main()
{
	int z;
	int i,j,k;
	int A[MAX],B[MAX];
	printf("please input vertex_num and vertex_pair_num\n");
	scanf("%d",&N);
	scanf("%d",&M);
	printf("please input M vertex_pairs\n");
	for(i=0;i<M;i++)
	{
		scanf("%d",&A[i]);
		scanf("%d",&B[i]);
	}
	//print A[i],B[i]
	//for(i=0;i<M;i++)
	//{
	//	printf("%d\t",A[i]);
	//	printf("%d\t",B[i]);
	//}
	//printf("\n");
	//initialize vertex
	for(i=1;i<=N;i++)
	{
		vertex[i]=i;
	}
	//initialize adjacency matrix
	for(i=1;i<=N;i++)
	{
		for(j=1;j<=N;j++)
		{
			adj[i][j]=0;
		}
	}
	//fill the adjaceny matrix
	for(i=1;i<=N;i++)//row   i=3
	{
		for(j=0;j<M;j++)//Traverse array A[j]  //j=2
		{
			if(i==A[j])      
			{
				//search B[j]'s location in vertex
				for(k=1;k<=N;k++)
				{
					if(B[j]==k)  //k=2
					{
						adj[i][k]=1;
						break;
					}
				}
			}
		}
	}
	//print the adjaceny matrix
	for(i=1;i<=N;i++)
	{
		for(j=1;j<=N;j++)
		{
			printf("%d\t",adj[i][j]);
		}
		printf("\n");
	}
	//call the function of DFS_cycle and print the result.
	for(z=1;z<N;z++)
	{
		DFS_cycle(z);
		printf("cycle=%d\t",cycle);
		printf("AnswerN=%d\t",AnswerN);
		if(cycle==0)
		{
			num=0;
			AnswerN=0;
			cycle=999;
		}
		else//若出现一个环,立马输出
			break;	
		printf("\n");
	}
	printf("\n");
	//DFS_cycle(1);//无输出	
	//DFS_cycle(2);//输出2——>4——>3——>2
	//DFS_cycle(3);//输出3——>2——>4——>3
	//DFS_cycle(4);//输出4——>3——>2——>4
	/*printf("cycle=%d\t",cycle);
	printf("AnswerN=%d\t",AnswerN);*/
	printf("环的组成\n");
	for(i=0;i<AnswerN;i++)
	{
		printf("%d\t",Answer[i]);
	}
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值