有 N 个比赛队(1<=N<=500) ,编号依次为 1,2,3, 。 。 。 。 ,N 进行比赛,比赛结束后, 裁判委员会要将所有参赛队伍从前往后依次排名, 但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即 P1 赢 P2,用 P1,P2 表示,排名时 P1 在 P2 之前。试编写程序,输出各队的排名顺序。
1. 需求规格说明
2. 有 N 个比赛队(1<=N<=500) ,编号依次为 1,2,3, 。 。 。 。 ,N 进行比赛,比赛结束后, 裁判委员会要将所有参赛队伍从前往后依次排名, 但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即 P1 赢 P2,用 P1,P2 表示,排名时 P1 在 P2 之前。试编写程序,输出各队的排名顺序。
2.总体分析与设计
(1)设计思想:
(<五号宋体>,具体内容:存储结构、主要的算法思想。)
题目要求邻接矩阵存储。
利用拓扑排序,将入度为0的点首先进入队列,设一个标记,将与他们相连的边都删掉,入度减一,在检查入度为零的进入队列。直到所有的点全部进行完毕。
排序阶段用next_permutation进行排序。
(3)详细设计表示:
(<五号宋体>,具体内容:主要算法的框架。)
ifstream in("排名确定.txt");
int v, e,v1,v2;
char temp;
in >> v >> temp >> e;
graph G(v, e);
for (int i = 0; i < e; i++){
in >> temp >> v1 >> temp >> temp >> v2;
G.Add(v1, v2);
}
G.TopsortbyQueue();
in.close();
3.编码
(<五号宋体>,具体内容:问题是如何解决的,编码过程中的困难与解决方法。)
困难1开始的时候不知道怎样去解决队名的问题,因为队名是p1-n;我之后使用的拓扑排序使用的是1-n,后来我和几位同学讨论的时候发现可以用1-n来替代队名,输出的时候只需要在前面加上p这个字母就行。
困难2这个程序并非我之前写的那个,我用栈做了一个,中间花了好多时间进行调试,不过因为我对书上的那个栈理解不是很透彻,所以下标等很多问题我都未解决,这个也花了几天时间还是未有结果。最后我选择了让同学教我怎么用队列做的思想,而且因为没时间再去敲队列的相关代码,就直接借用了同学的。
4.小结
(<五号宋体>,具体内容:经验与体会,或需要改进的地方)
这一题的代码我写了很久,因为我对书上栈的运用不是很懂,所以到最后的时候队名的传递总会有这样那样的问题,我调试了很久还是不行,整个人很焦躁。后来感觉我自己实在调试不出来的时候,就让同学帮我讲讲他的思路,后来才做了出来。
5. 答案截图
6.附录
(<五号宋体>,部分核心代码)
int v, e,v1,v2;
char temp;
in >> v >> temp >> e;
graph G(v, e);
for (int i = 0; i < e; i++){
in >> temp >> v1 >> temp >> temp >> v2;
G.Add(v1, v2);
}
inDegree();
queue Q;
int i;
for (i = 1; i <=VerticesNum(); i++){
if (indegree[i] == 0){
indegree[i]=-1;
Q.Enqueue(i);
A[N]=i;N++;
}
}
B[t]=N;t++;
do{
while (!Q.isEmpty()){
int v;
Q.Dequeue(v);
indegree[v]=-1;
for (i = 1; i <= VerticesNum(); i++){
if (Exist(v, i)){
indegree[i]--;
Remove(v, i);
}
}
}
for (i = 1; i <= VerticesNum(); i++){
if ((indegree[i] == 0)){
indegree[i]=-1;
Q.Enqueue(i);
A[N]=i;N++;
}
}
B[t]=N;t++;
}while (!Q.isEmpty());
fstream file_out("A.txt",ios::out);
int M=0;
do
{
for(int i=0;i<N;i++){
file_out<<A[i]<<" ";
}
file_out<<endl;M++;
} while ((next_permutation(A,A+B[0])||next_permutation(A+B[1],A+B[2])||next_permutation(A+B[2],A+B[3]))||next_permutation(A+B[0],A+B[1]));
file_out<<M;
file_out.close();