Toposort Description    给出一个有向图,判断图中是否存在回路。 Input:   第1行:输入图的顶点个数N(1 ≤ N≤ 2,500)和C(图的边数,1 ≤ C ≤ 6,20

Toposort

Description

给出一个有向图,判断图中是否存在回路。

Input:

1行:输入图的顶点个数N1 ≤ N 2,500)和C(图的边数,1 ≤ C ≤ 6,200);

2C+1行中,第i+1行输入两个整数,分别表示第i条边的起点和终点的编号。

Output:

如果图中存在回路,输出“YES”,否则,输出“NO”。

Sample Input:

7 8

1 2

1 3

2 4

2 6

3 4

4 5

5 2

5 7  

Sample Output:

YES

#include<iostream>
using namespace std;
class graphm
{ private:
    int numvertex,numedge;
	int **matrix;
	int *mark;
	int *dout;
	int *din;
 public:
    graphm(int numv)
	{ int i,j;
	  numvertex=numv;
	  numedge=0;
	  mark=new int [numv];
	  dout=new int [numv];
	  din =new int [numv];
	  for(i=0;i<numv;i++)
	  { mark[i]=0;}
	  matrix=(int**) new int*[numvertex];
	  for(i=0;i<numvertex;i++)
	     matrix[i]= new int [numvertex];
	  for(i=0;i<numvertex;i++)
	  { dout[i]=0;din[i]=0;
		for(int j=0;j<numvertex;j++)
		{ matrix[i][j]=0;}
	  }
	}
	~graphm()
	{ delete [] mark;
	  for(int i=0;i<numvertex;i++)
		  delete [] matrix[i];
	  delete [] matrix;
	}
	int n() {return numvertex;}
	int e() { return numedge;}
	int first(int v)
	{ int i;
	  for(i=0;i<numvertex;i++)
	  { if(matrix[v][i]!=0) return i;
	  }
	  return i;
	}
	int next(int v1,int v2)
	{ int i;
	  for(i=v2+1;i<numvertex;i++)
		  if(matrix[v1][i]!=0) return i;
	  return i;
	}
	void setedge(int v1,int v2, int wgt)
	{ if(matrix[v1][v2]==0) numedge++;
	  matrix[v1][v2]=wgt;
	}
	void deledge(int v1,int v2)
	{ if(matrix[v1][v2]!=0){ numedge--;dout[v1]--;din[v2]--;}
	  matrix[v1][v2]=0;
	}
	int weight(int v1,int v2) {return matrix[v1][v2];}
	int getmark(int v) {return mark[v];}
	void setmark(int v,int val) { mark[v]=val;}
	void degree()
	{ int i,j;
	  for(i=0;i<numvertex;i++)
	  { for(j=0;j<numvertex;j++)
		  { if(matrix[i][j]>0) { din[j]++;dout[i]++;}
		  }
	   }
	}
	int indegree(int v)
	{ return din[v];}
	int outdegree(int v)
	{ return dout[v];}
	void delvertex(int v)
	{ for(int i=0;i<numvertex;i++)
	     deledge(v,i);
	}
};
int main()
{ int n,c;
  while(cin>>n>>c)
  { int in,out;
    graphm G(n);
	int i,j;
	int *din,*dout;
	int count=0;
	int nx=0;
	din=new int [n];
	dout=new int [n];
	for(i=0;i<c;i++)
	{ cin>>out>>in;
	  G.setedge(out-1,in-1,1);
	}
	G.degree();
	while(n>0&&count<n)
	{ count++;
	  for(i=0;i<n;i++)
	  { if(G.indegree(i)==0){ G.delvertex(i);}
	   }
	}
	for(i=0;i<n;i++)
	{ if(G.indegree(i)!=0) {nx=1;break;}
	}
	if(nx==1) cout<<"YES"<<endl;
	if(nx==0) cout<<"NO"<<endl;
  }
}
	     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值