uva6195
来源:互联网 发布:搜索引擎优化实战培训 编辑:程序博客网 时间:2024/05/18 12:44
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4206
此题就是求拓扑排序的个数 图没有拓扑排序则输出0 只有一种拓扑排序则输出1 有2种及以上的拓扑排序则输出2
下面是代码
// topsort.cpp : Defines the entry point for the console application.//#include <iostream>#include <cstdlib>#include <queue>using namespace std;#define MAXNUM 1000typedef struct edge{ int argv; struct edge *next;}Edge;typedef struct vertex{ int rudu; struct edge *first;}Vertex;typedef struct graph{ Vertex v[MAXNUM]; int n; int m;}Graph;int main(int argc, char **argv){ Graph g; queue<int> q; int n1, m1,s,e,output,queuenum; struct edge *temp; cin >> n1; cin >> m1; while (n1 != 0 || m1 != 0) { g.n = n1; g.m = m1; output = 1;//默认输出为1 当图没有拓扑排序的时候为0 只有一个拓扑排序为1 有超过1个拓扑排序为2 queuenum = 0;//从队列中输出的顶点的个数 for (int i = 1; i <= g.n; i++)//将图的n个顶点进行初始化 { g.v[i].first = NULL; g.v[i].rudu = 0; } for (int i = 0; i < g.m; i++)//读入m条边 { cin >> s;//输入边起点 cin >> e;//输入边终点 temp = new edge; temp->argv = e; temp->next = g.v[s].first; g.v[s].first = temp; g.v[e].rudu++;//终点入度增加1 } for (int i = 1; i <= g.n; i++)//找到所有入度为0的顶点 将其压入队列之中 { if (g.v[i].rudu == 0) q.push(i); } while (!q.empty()) { if (q.size() > 1)//只要队列中有同时存在不止一个入度为0 的元素则说明拓扑排序的顺序不止一个 修改输出为2 output = 2; int tmp = q.front(); queuenum++;//记录从队列中输出的顶点的个数 q.pop(); for (temp = g.v[tmp].first; temp; temp = temp->next) { if (--g.v[temp->argv].rudu == 0) q.push(temp->argv); } } if (queuenum < g.n)//没有完全输出则说明存在环 output = 0; cout << output << endl; while (!q.empty()) q.pop(); cin >> n1; cin >> m1; } return 0;}
0 0