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
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; } }
相关文章推荐
- hdu 2647(拓扑排序,判断有向图是否存在回路及自环,并统计每个顶点的前驱点数)
- 对于一个整数矩阵,存在一种运算,对矩阵中任意元素加一时,需要其相邻(上下左右)某一个元素也加一, 现给出一正数矩阵,判断其是否能够由一个全零矩阵经过上述运算得到。
- 对于一个整数矩阵,存在一种运算,对矩阵中任意元素加一时,需要其相邻(上下左右)某一个元素也加一, 现给出一正数矩阵,判断其是否能够由一个全零矩阵经过上述运算得到。
- 《C++第六周实验报告4-1》---设计一个三角形类,能够输入三角形的三个顶点,求出其面积、周长,并判断其是否为直角三角形和等腰三角形。
- Java代码 给出一个二叉树和一个数,判断该二叉树是否存在一个从根节点到叶节点的和与给出的数相同
- 对于一个整数矩阵,存在一种运算,对矩阵中任意元素加一时,需要其相邻(上下左右),某一个元素也加一,现给出一正数矩阵,判断其是否能够由一个全零矩阵经过上述运算得到。
- (floyd 1.1)hdu 1217 Arbitrage(使用floyd来求最长路——判断是否存在一种货币,经过一个兑换回路以后>=1单元)
- 对于一个整数矩阵,存在一种运算,对矩阵中任意元素加一时,需要其相邻(上下左右)某一个元素也加一,现给出一正数矩阵,判断其是否能够由一个全零矩阵经过上述运算得到
- 对于一个整数矩阵,存在一种运算,对矩阵中任意元素加一时,需要其相邻(上下左右)某一个元素也加一, 现给出一正数矩阵,判断其是否能够由一个全零矩阵经过上述运算得到。
- 如何判断一个图中是否存在回路
- 提示用户通过键盘输入一个用户名,来判断这个用户是否存在,如果存在就显示一下用户默认的shell
- 交互式让用户输入一个文件路径,判断文件是否存在,若存在判断文件类型,若文件是普通文件,不能使用wc。
- 给出一个实数集合和一个实数,怎样判断集合中是否存在两个和等于该实数的元素
- PB技巧一《在主表中一个编号一个名称,通过输入判断是否编号存在》
- Linked List Cycle 判断一个链表是否存在回路(循环)
- 给出一个整数,判断集合中是否存在子集之和等于该整数?
- 设计一个三角形类,能够输入三角形的三个顶点,求出其面积、周长,并判断其是否为直角三角形和等腰三角形。
- 对于一个m*n的整数矩阵,其中每一行和每一列的元素都按升序排列,设计一个高效的算法判断一个数值是否存在,并给出位置
- 判断一个有向图中是否存在一个环(C++代码)
- 链表的基本操作 (1)采用尾插法建立一个链表; (2)输入一个元素,在道表中查找该元素是否存在,请给出相关信息; (3)将链表中的元素进行就地逆置。