解题思路:
这道题是典型的拓扑排序问题,要用到入度问题的话,那么邻接表是个不错的存储选择
注意事项:
这道题拓扑排序的算法规规矩矩,但是一定要注意输出顺序
参考代码:
#include <bits/stdc++.h> using namespace std; #define Size 100010 struct Edge//边表 { int adjvex;//边连接的起始点 int weight;//权值 Edge* next; }; typedef struct Node //节点表 { Edge* firstEdge;//顶点连接的下一个节点 int in;//这里的in表示入度 int val;//节点所对应的值 }List[Size]; struct Mgraph //图表 { int numvex,numEdge; List arc; }; void createGraph(Mgraph* G) //构建邻接表 { cin >> G->numvex; for (int i = 0; i < G->numvex; i++) G->arc[i].val = i; for (int i = 0; i < G->numvex; i++) { for (int j = 0; j < G->numvex; j++) { int value; cin >> value; int start = i; //因为给的是邻接矩阵的形式就是[i][j],但是转化成邻接表就得用链表形式转化一下 int end = j; if (value) //如果为零,则说明没有路 { Edge* p = new Edge(); p->adjvex = end; p->weight = value; G->numEdge++; p->next = G->arc[start].firstEdge; G->arc[start].firstEdge = p; G->arc[end].in++; } } } } queue<int>to;//用来存最终的输出结果 bool top_sort(Mgraph *G)//拓扑排序 { stack<int>s; int count = 0;; for (int i = 0; i < G->numvex; i++)//将所有度为零的点进栈 { if (!G->arc[i].in)//如果入度为零,就入栈操作 { s.push(i); } } while (!s.empty()) { int k = s.top(); s.pop(); ++count;//度为零的点数 to.push(G->arc[k].val); for(Edge*p=G->arc[k].firstEdge;p;p=p->next) { if (!--(G->arc[p->adjvex].in))//先将去除的顶点连的弧去掉,最终判断 { s.push(p->adjvex);//如果去掉弧以后入度为零,就入栈 } } } if (count < G->numvex)//证明有环 { return false; } else return true; } /* 一定要注意这里的链表反转,尤其重要,是出现50分的原因,因为他要按照降序的方式拓扑排序,因为在最开始的邻接表初始化的时候是头插, 我在这里困了两个小时,希望大家注意 */ Edge* reverse(Edge *T) { Edge* p=NULL, * q=NULL; Edge* pos = T; while (pos) { q = pos->next; pos->next = p; p = pos; pos = q; } return p; } int main() { Mgraph *G=new Mgraph(); createGraph(G); for (int i = 0; i < G->numvex; i++) G->arc[i].firstEdge = reverse(G->arc[i].firstEdge); if (top_sort(G)) { while (!to.empty()) { cout << to.front() << " "; to.pop(); } } else cout << "ERROR"; return 0; }
0.0分
1 人评分
C二级辅导-进制转换 (C语言代码)浏览:551 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:590 |
2006年春浙江省计算机等级考试二级C 编程题(1) (C语言代码)浏览:912 |
Hello, world! (C语言代码)浏览:1315 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:1015 |
C语言程序设计教程(第三版)课后习题8.5 (C语言代码)浏览:562 |
C语言程序设计教程(第三版)课后习题9.1 (C语言代码)浏览:710 |
a+b浏览:452 |
循环入门练习5 (C语言代码)浏览:907 |
Tom数 (C语言代码)浏览:758 |