您的位置:首页 > 运维架构

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

2012-12-27 23:58 411 查看
Toposort

Description

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

Input:

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

第2到C+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
;
dout=new int
;
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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐