拓扑排序

拓扑排序
描述:
学校领导在大学生培养计划的制订中,涉及到课程的安排问题,由于课程较多,现在要求编程高手的你帮忙。假定课程之间的先修关系已确定,现在要求你根据先修关系,通过编程确定各门课程的先后关系,并生成一张课程先后安排顺序表,以帮助学校设置各年度课程。
输入:
输入只包括一个测试用例,第一行为一个自然数n,表示课程数量,第二行为n个单词,分别表示n门课程,一个单词表示一门课程,单词全为小写状态,各单词之间用一个空格隔开。
接下来为n*n行0和1构成的矩阵,表示各门课程之间的先修关系。假设i行j列为1,表示第i课程为第j课程的先修课。否则表示不存在先修关系。
输出
要求根据各课程之间的先修关系,用一行输出课程的拓扑排序结果。注意:如果两门课程的访问顺序相同,则根据课程名的字典顺序进行访问。
样例输入
4
db c computer math
0 0 0 0
1 0 1 0
0 0 0 0
0 0 1 0

样例输出:
c db math computer

AC code:

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

struct ENode  // 结点结构体
{
	string str;
	struct ENode *next;
};

struct T   // 头结点结构体
{
	int flag;      // 标记
	ENode *fc;     // 指向结点指针
}HNode[100];

bool cmp(T a,T b)   // 按字典序排序
{
	return a.fc->str<b.fc->str;
}
int main()
{
	ENode *p,*g;
	int n,i,j,k,e; 
	while(cin>>n)
	{
		for(i=1;i<=n;i++)
		{ 
			HNode[i].fc=new ENode;    // 这里有个巧妙的方法将字符放到 fc中
			cin>>HNode[i].fc->str; 
			HNode[i].fc->next=NULL;
			HNode[i].flag=0;          // 0表示未访问过
		}
		for(i=1;i<=n;i++)
			for(j=1;j<=n;j++)
			{
				cin>>e;                  // 不为0是 表示 存在关系
				if(e)
				{
					p=new ENode;          //  逆邻接表存储
					p->str=HNode[i].fc->str;
					p->next=HNode[j].fc->next;   // 这里采用前插法
					HNode[j].fc->next=p;
				}
			}
			
			sort(HNode+1,HNode+n+1,cmp);   // 按字典序排序  
			//ps:如果从1开始 ,开始要加1,果断我被坑了。
			for(j=1;j<=n;j++)
			{
				for(k=1;k<=n;k++)
				{
					//存在一个未标记,且没有结点的输出及删除,标记已访问过
					if(HNode[k].flag==0 && HNode[k].fc->next==NULL)
					{
						if(j<n)
							cout<<HNode[k].fc->str<<" ";
						else
							cout<<HNode[k].fc->str<<endl;
						HNode[k].flag=1;  // 标记
						for(i=1;i<=n;i++)
						{
							// 遍历所有的结点,存在上面要删除的点,将其删除
							g=HNode[i].fc;  
							while(g->next)  
							{
								// 注意这里的2中情况,小心报错
								if(g->next->str==HNode[k].fc->str) 
								{
									g->next=g->next->next;
								}
								else
									g=g->next;
							}
						}
						break;  // 这里要退出循环重新遍历,找那些没有标记且没有节点的头节点
					}
					
				}
			}
	}
	
	
	return 0;
}
这个题目做了很久,最后参考大神的代码: http://www.cpproad.com/blog/?p=497
现在自己感觉真的菜,我在这里向xwl2014大神 Orz。

你可能感兴趣的:(拓扑排序)