#include using namespace std; const int N = 30; //26个结点是极限 const int M = 610; //600条边是极限 int in[N]; //入度数组 int tmp[N]; //入度临时操作数组 int n; //表示需要排序的元素数量 int m; //表示将给出的形如 A q; //拓扑排序用的队列 int sum = 0;//入队列数量 //判断现在是不是有环,有环则退出。入度为0的结点入队列,进行拓扑排序 for (int j = 1; j <= n; j++) if (!tmp[j]) q.push(j); //拓扑排序 while (!q.empty()) { int u = q.front(); q.pop(); sum++; //不是环中结点 st[u] = true; //遍历每条出边 for (int j = head[u]; j; j = edge[j].next) { int y = edge[j].to; if (!--tmp[y]) q.push(y);//在删除掉当前结点带来的入度后,是不是入度为0了,如果是将点y入队列 } } //存在没进过队列的结点,存在表示有环。 return sum < n; } int main() { //读入结点数和边数 cin >> n >> m; //读入关系,建图,边建图边判断 for (int i = 1; i <= m; i++) { string input; cin >> input; char x = input[0], y = input[2];//input[1]='<' 这个是死的,没用 //建图 int a = x - 'A' + 1, b = y - 'A' + 1; add(a, b); //建立单边有向图,描述a 1) continue; //存在两个及以上入度为零的点,是无法确定先后顺序的,需要继续读入关系数据 //从startNode出发,看看能不能走出去n轮,如果能,就是可以确定所有结点的顺序,如果不能,就需要继续录入关系才能确定 string path; queue q; q.push({startNode, chr.substr(startNode - 1, 1)}); //清空状态数组,准备再战! memset(st, 0, sizeof st); while (!q.empty()) { Node u = q.front(); q.pop(); st[u.n] = true; if (u.path.size() > path.size())path = u.path; //遍历每条出边 for (int j = head[u.n]; j; j = edge[j].next) { int y = edge[j].to; q.push({y, u.path + chr.substr(y - 1, 1)}); } } //如果还存在没访问到的结点,那么就是无法完成排序,需要继续录入关系 if (path.size() < n) continue; //输出路径 printf("Sorted sequence determined after %d relations: %s.", i, path.c_str()); exit(0); } //到达这里说明最终还没有确定下来所有结点关系,提示无法确定。 printf("Sorted sequence cannot be determined."); return 0; }