判斷給定有向圖是否存在迴路
1000(ms)
10000(kb)
1969 / 4499
Tags: 圖
判斷給定有向圖是否存在迴路。
輸入
第一行爲圖中頂點的個數n; 第二行爲途中弧度條數e; 第二行爲頂點信息;接着e行爲e條弧依附的兩個頂點。
輸出
該圖是否存在迴路,是輸出yes;,不是輸出no。
樣例輸入
4 4 A B C D A B A C B D C D
樣例輸出
no
#include<stdio.h>
int n,m;
int map[100][100]={0};
char str[100];int t=0;
void Find(int j,int flag[],int top)
{
if(flag[j]==0)
{
if(j==top)//如果j等於起始點,則存在迴路
{
t=1;
}
flag[j]=1;
for(int i=0;i<n;i++)//深度優先遍歷
{
if(map[j][i]!=0&&flag[i]==0)
{
Find(i,flag,top);
}
}
flag[j]=0;//還原標記
}
}
int main()
{
scanf("%d",&n);
scanf("%d",&m);
for(int i=0;i<m;i++)
{
getchar();//抵消回車或者空格
scanf("%c",&str[i]);
}
for(int i=0;i<m;i++)
{
char a,b;//抵消回車
getchar();
scanf("%c",&a);
getchar();//抵消空格
scanf("%c",&b);
for(int j=0;j<n;j++)//找到對應的行和列 ,並且賦值爲1
{
if(str[j]==a)
{
for(int k=0;k<n;k++)
{
if(str[k]==b)
{
map[j][k]=1;
break;
}
}
break;
}
}
}
for(int i=0;i<n;i++)//依次從開始到n-1查找是否存在迴路
{
int flag[100]={0};//初始化標記
for(int j=0;j<n;j++)
{
if(map[i][j]!=0)
{
Find(j,flag,i);
}
}
}
if(t==1) printf("yes");
else printf("no");
}