Toposort Description 给出一个有向图,判断图中是否存在回路。 Input: 第1行:输入图的顶点个数N(1 ≤ N≤ 2,500)和C(图的边数,1 ≤ C ≤ 6,20
来源:互联网 发布:安卓字体软件 编辑:程序博客网 时间:2024/06/06 01:50
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 [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; }}
- Toposort Description 给出一个有向图,判断图中是否存在回路。 Input: 第1行:输入图的顶点个数N(1 ≤ N≤ 2,500)和C(图的边数,1 ≤ C ≤ 6,20
- CF223 div2 (C)给出m个操作,1表示在串中添加一个数,2表示将前面长度为l的串复制c次添加到串尾。有n个查询,问你第i个数是什么
- 阶乘之和Description 输入n,计算S=1!+ 2!+…+ n!的末6位(不含前导0)。这里,n!表示前n个正整数之积。 Input 输入n,,n≤ 106。 Output 输出S的
- c语言判断素数和输入一个数n代表有n行数据的问题
- 1.求一个整数的二进制中1的个数 2.判断一个数是否是2的n次方
- 关于无向图判断是否存在回路的方法
- 判断有向图是否存在回路—拓扑排序
- 【C#】判断一个数是否是2的N次方
- UVa10129 判断有向图中是否存在欧拉回路
- C++:输入一个数n; 输出的是一个有*和#构成的n*n的正方形; 一圈套一圈~~~~
- 整数的二进制数中1的数目,1-N中1的总共个数,如何判断一个数是否为2的整数次幂.
- 判断有向图是否存在环、环的个数、环的元素
- 位运算 - 判断一个数是否为2的n次方 | 求一个数位为1的个数
- 经典算法-给出2n+1个数,其中有2n个数出现过两次,用简便的最方法求出现一次的数
- 第一个问题是给出2n+1个数,其中有n个数是成对出现的,让我找出里面只出现了一次的那个数。
- 判断无向图是否有回路
- 判断无向图是否有回路
- 无向图中判断存在回路
- mysql学习之--mysql的增删改查
- 在 Interface Builder 中使用自定义的视图
- 【Android】ImageView.ScaleType说明
- iOS应用程序生命周期(前后台切换,应用的各种状态)详解
- 很酷的C语言技巧
- Toposort Description 给出一个有向图,判断图中是否存在回路。 Input: 第1行:输入图的顶点个数N(1 ≤ N≤ 2,500)和C(图的边数,1 ≤ C ≤ 6,20
- 设置系统超时时间
- 一篇关于二叉树操作很实用的帖子
- 解决mysql“Access denied for user root@localhost”
- vector使用中可能出现的一个陷阱
- 组合数学之转动群结构记忆法
- 【Cocos2d-x游戏引擎开发笔记(3)】在屏幕上渲染菜单并添加消息响应
- <模板><计算几何>半平面求交学习小记
- 系统重置