西南科技大學OJ題 判斷給定有向圖是否存在迴路1076

判斷給定有向圖是否存在迴路

 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"); 
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章