A - 図の10の構造上の実験データ:正当である場合、図トポロジの所与のシーケンスかどうかを決定します

説明

図法的トポロジ配列が存在するか否かを判断する有向グラフを、与えられました。
入力

複数組、各フォーマットを含む入力。

最初の行は、有向グラフと頂点と辺の数を表す2つの整数N、Mを含有します。(N <= 10)

二行の後ろにMの各整数AB、Bへの有向エッジを表し、そこから。

出力

もし図法的トポロジー、次いでYES出力に所定の配列の存在は、そうでない場合、出力NO。

サンプル

入力

1 0
2 2
1 2
2 1
出力

YES
NO

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
int in[110];
int Map[110][110];
int main()
{
    int n,m;
    int u,v;
    int flag;
    while(~scanf("%d %d",&n,&m))
    {
        memset(in,0,sizeof(in));
        memset(Map,0,sizeof(Map));
        for(int i=0;i<m;i++)
        {
            scanf("%d %d",&u,&v);
            Map[u][v] = 1;
            in[v]++;
        }
        for(int i=1;i<=n;i++)
        {
           flag = 0;
           for(int j=1;j<=n;j++)
           {
               if(in[j] == 0)
               {
                   in[j] = -1;
                   flag = 1;
                   for(int k=1;k<=n;k++)
                   {
                       if(Map[j][k] == 1)
                            in[k]--;
                   }
                   break;
               }
           }
           if(flag == 0)
            break;

        }
        if(flag)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}


II考え:VISフラグビット上の点0度、点マイナス(削除側)に接続され、次いで度を見つけ、そしてn点が知っている標識されている場合、最終的に参照することのトポロジ配列ではありません

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
int in[110];
int vis[110];
int Map[110][110];
int main()
{
    int n,m;
    int u,v;
    int flag;
    while(~scanf("%d %d",&n,&m))
    {
        memset(in,0,sizeof(in));
        memset(Map,0,sizeof(Map));
        memset(vis,0,sizeof(vis));
        for(int i=0;i<m;i++)
        {
            scanf("%d %d",&u,&v);
            Map[u][v] = 1;
            in[v]++;
        }
        for(int i=1;i<=n;i++)
        {
            if(in[i]==0)
            {
                vis[i]=1;
                in[i] = -1;
                for(int j=1;j<=n;j++)
                {
                    if(Map[i][j] == 1)
                    {
                        in[j]--;
                        Map[i][j] = 0;
                    }
                }
            }
        }
        flag = 1;
        for(int i=1;i<=n;i++)
        {
            if(vis[i] == 0)
            {
                flag = 0;
                break;
            }
        }
        if(flag)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}


公開された177元の記事 ウォン称賛7 ビュー30000 +

おすすめ

転載: blog.csdn.net/Fusheng_Yizhao/article/details/104919035