説明
図法的トポロジ配列が存在するか否かを判断する有向グラフを、与えられました。
入力
複数組、各フォーマットを含む入力。
最初の行は、有向グラフと頂点と辺の数を表す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;
}