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

有向图中使用邻接表表示数据结构时,我们可以利用深度优先搜索(DFS)策略来实现拓扑排序。拓扑排序是对有向无环(DAG)的顶点按照依赖关系进线性排序的一种方法。下面是一个基于Python的简单实现: 首先,我们假设`Graph`类表示有向图,它有一个邻接列表以及一个标记未访问节点的辅助集合。`visit`函数用于记录访问状态,而`toposort()`函数则执拓扑排序。 ```python class Node: def __init__(self, value): self.value = value self.neighbors = [] class Graph: def __init__(self, edges): # 初始化邻接表 for edge in edges: src, dst = edge src.neighbors.append(dst) def visit(self, node): if node not in self.visited: node.visited = True for neighbor in node.neighbors: self.visit(neighbor) def toposort(self): self.visited = set() result = [] def dfs(node): self.visit(node) result.append(node.value) # 对每个起点执DFS for node in self.graph: if node not in self.visited: dfs(node) return result[::-1] # 返回结果并保证从源到目标的顺序 # 使用示例 edges = [(1, 0), (2, 0), (2, 1), (3, 1)] graph = Graph(edges) print(graph.toposort()) # 结果取决于的连接顺序,例如 [0, 1, 2, 3] ``` 在这个例子中,`toposort()`首先初始化所有节点为未访问,然后对每个未访问的节点开始递归的深度优先遍历。每访问一个节点,就将其加入结果列表中。最后返回的结果就是拓扑排序后的节点序列。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值