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

来源:互联网 发布:安卓字体软件 编辑:程序博客网 时间:2024/06/06 01:50

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