samsung第一次面试题(20180302)
程序员文章站
2022-06-19 08:25:58
...
一、题目要求
遍历一个图,输出它的其中一个环。
格式:顶点数 顶点对数例如:
输入
5 54 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]);
}
}
上一篇: AI异构计算
下一篇: Thinkphp 部署/模块部署