赞
踩
利用Floyd求解无向图最小环
//给出一棵二叉树,求两个节点之间的距离。 //输入格式 //第一行为数据组数T //每组数据第一行整数n代表二叉树节点的个数。 //接下来n行,每行两个整数p,q,其中第K(1<=K<=n)行代表结点K的左右子结点分别为p,q。若无子节点则用-1表示。根节点编号为1。 //接下来m行,每行两个整数a,b(1<=a,b<=n) //求出最小环 //输入样例: //1 //3 //2 3 //-1 3 //-1 -1 //输出样例: //最小环是 3 #include <bits/stdc++.h> using namespace std; const int MAXN=100; const int INF=INT_MAX; int dis[MAXN][MAXN]; int g[MAXN][MAXN]; int Add(int x,int y) { if(x==INF||y==INF) return INF; else return x+y; } int Add2(int x,int y,int z) { if(x==INF||y==INF||z==INF) return INF; else return x+y+z; } int main() { int casenumber; scanf("%d",&casenumber); while(casenumber--) { for(int i=0;i<MAXN;i++) { for(int j=0;j<MAXN;j++) { dis[i][j]=INF; g[i][j]=INF; } dis[i][i]=0; g[i][i]=0; } int n; scanf("%d",&n); for(int i=1;i<=n;i++) { int p,q; scanf("%d%d",&p,&q); if(p!=-1) { dis[p][i]=dis[i][p]=1; g[p][i]=g[i][p]=1; } if(q!=-1) { dis[q][i]=dis[i][q]=1; g[q][i]=g[i][q]=1; } } int minimum_cycle=INF; for(int k=1;k<=n;k++) { for(int i=1;i<k;i++) { for(int j=i+1;j<k;j++) { minimum_cycle=min(minimum_cycle,Add2(dis[i][j],g[i][k],g[k][j]));. } } for(int i=1;i<=n;i++) { for(int j=i;j<=n;j++) { if(dis[i][j]>Add(dis[i][k],dis[k][j])) { dis[i][j]=dis[j][i]=Add(dis[i][k],dis[k][j]); } } } } if(minimum_cycle==INF) cout<<"无环"<<endl; else cout<<"有环,且最小环为:"<<minimum_cycle<<endl; } return 0; }
拓扑排序判断有向图是否有环
/* 3 2 0 1 1 2 2 2 0 1 1 0 0 0 输出 无环 有环 */ #include <iostream> #include <cstdio> #include <cstring> #include <queue> using namespace std; const int MAXN=500; int inDegree[MAXN]; vector<int>graph[MAXN];//邻接表的结构! bool TopologicalSort(int n) { queue<int>node; for(int i=0;i<n;i++) { if(inDegree[i]==0) { node.push(i); } } int number=0; while(!node.empty()) { int u=node.front(); node.pop(); number++; for(int i=0;i<graph[u].size();++i) { int v=graph[u][i]; inDegree[v]--; if(inDegree[v]==0) { node.push(v); } } } return n==number; } int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF) { if(n==0&&m==0) break; memset(graph,0,sizeof(graph)); memset(inDegree,0,sizeof(inDegree)); while(m--) { int from,to; scanf("%d%d",&from,&to); graph[from].push_back(to); inDegree[to]++; } if(TopologicalSort(n)) { printf("无环\n"); } else printf("有环\n"); } return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。