题目描述
输入
输出
示例输入
1 0 2 2 1 2 2 1
示例输出
YES NO
提示
#include <iostream>
#include<stack>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
typedef struct arcnode//表结点;
{
int adj;
struct arcnode *next;
}arcnode;
typedef struct vnode//头结点;
{
int data;
arcnode *first;
}adjlist[10];
typedef struct//表结构;
{
adjlist a;
int vn,an;
}ALG;
int n,m,i,j;
int indegree[10];//记录每个节点的入度;
void create(ALG &g)//建立有向图的邻接表;
{
int v1,v2;
arcnode *p;
g.an=m;
g.vn=n;
for(i=1;i<=g.vn;i++)
g.a[i].first=NULL;//头结点清空;
for(i=1;i<=g.an;i++)
{
scanf("%d%d",&v1,&v2);
p=new arcnode;
p->adj=v2;
indegree[v2]++;
p->next=g.a[v1].first;
g.a[v1].first=p;
}
}
void topo(ALG &g)//判断图是否满足拓扑排序;
{
int k;
arcnode *p;
stack<int>s;
for(i=1;i<=n;i++)
if(!indegree[i])//入度为零的结点入栈;
s.push(i);
int count=0;//记录出栈元素的个数,最后判断是否满足拓扑排序;
while(!s.empty())
{
j=s.top();
s.pop();
count++;//统计栈内有多少个元素;
for(p=g.a[j].first;p;p=p->next)//删除所有以j为起点的边;
{
k=p->adj;
if(!(--indegree[k]))//将新入度为零的结点入栈;
s.push(k);
}
}
if(count<n)//出栈元素少于结点个数,说明存在原图有环;
printf("NO\n");
else
printf("YES\n");
}
int main()
{
ALG g;
while(~scanf("%d%d",&n,&m))
{
memset(indegree,0,sizeof(indegree));//元素出度的初始化;
create(g);
topo(g);
}
return 0;
}
#include <iostream>
#include<cstdio>
#include<queue>
using namespace std;
#include<cstring>
#include<algorithm>
int map[20][20],in[15],vis[15];
int main()
{
int n,m;
int i,j,k;
while(cin>>n>>m)
{
memset(in,0,sizeof(in));
memset(map,0,sizeof(map));
memset(vis,0,sizeof(vis));
while(m--)
{
int v,u;
cin>>u>>v;
if(!map[u][v])
in[v]++,map[u][v]=1;
}
for(k=0;k<n;k++){
for(i=1;i<=n;i++)
if(!in[i]&&!vis[i]){
vis[i]=1;
for(j=1;j<=n;j++){
if(map[i][j])
map[i][j]=0,in[j]--;
}
break;
}
if(i>n)
break;
}
if(k<n){
cout<<"NO\n";
}
else
cout<<"YES\n";
}
}