判断无向图是否有环(求图传递闭包)
来源:互联网 发布:淘宝属于腾讯软件吗 编辑:程序博客网 时间:2024/06/06 09:21
/*判断无向图是否有环(求图传递闭包)*/#include <iostream>#include <stdlib.h>#include <vector>#include <memory.h>using namespace std;int n,m;int matrix[1001][1001];inline bool noLoop(){ //求出图的传递闭包 // 例如 i->k,i可以到达k,则就在i列中,找出可以到达i的j,扫描k列所有行即可 for(int i=1; i<=n; i++) for(int k=1; k<=n; k++) if(matrix[i][k]) { //扫描k列所有的行 for(int j=1; j<=n; j++) if(matrix[j][i]) //如果存在j可达i,则说明j也可到k 则令其为1 matrix[j][k] =1; } //找完闭包后,要判断是否形成回路闭包,只需要判断是否存在节点i可以连通到自身 for(int i=1; i<=n ; i++) if(matrix[i][i]) return false; return true;}int main(){ while(cin >> n >> m) { //memset(visit, 0, sizeof(visit)); memset(matrix, 0, sizeof(matrix)); for(int i=1; i<= m; i++) { int start, end; cin >> start >> end; matrix[start][end] = 1; matrix[end][start] =1; } if(!noLoop()) { cout << "no" << endl; } else cout << "yes" << endl; } system("pause"); return 0;}