题目链接:xmu1073
方法:拓扑排序
代码:
#include <iostream>
#include <stack>
#include <string>
#include <cstring>
#include <vector>
using namespace std;
const int MAXNUM=505;//最大顶点数目
typedef string type;
struct node
{
type data;
vector <int> next;//存储该顶点可以访问的顶点序号
};
struct graph
{
node vex[MAXNUM];//顶点信息
int vexnum,degree[MAXNUM];//顶点数目,顶点入度
};
bool topsort(graph g)
{
stack <int> s;
int i,j,count=0,flag=1;
int ans[MAXNUM];//记录拓扑排序后顶点的序号
for(i=0;i<g.vexnum;i++)
if(!g.degree[i])s.push(i);
while(!s.empty())
{
int tmp=s.top();s.pop();
ans[count]=tmp; count++;
for(i=0;i<g.vex[tmp].next.size();i++)
if(!(--g.degree[g.vex[tmp].next[i]]))
s.push(g.vex[tmp].next[i]);
}
if(count<g.vexnum)
{
cout<<"Impossible!"<<endl;
return false;
}
else
{ for(i=0;i<g.vexnum;i++)
if(i<g.vexnum-1)cout<<g.vex[ans[i]].data<<' ';
else cout<<g.vex[ans[i]].data<<endl;
return true;
}
}
int main()
{
int n,m;
while(cin>>n)
{
int i,j;
graph g; g.vexnum=n;
for(i=0;i<n;i++)cin>>g.vex[i].data;
memset(g.degree,0,sizeof(g.degree));
for(i=0;i<n;i++)
{
cin>>g.degree[i];
for(j=0;j<g.degree[i];j++)
{
int tmp;
cin>>tmp;tmp=tmp-1;//序号从0开始
g.vex[tmp].next.push_back(i);
//由于是先修课程,应该是前面的课程可以访问该节点
}
}
bool res=topsort(g);
/*if(res)cout<<"拓扑排序成功"<<endl;
else cout<<"图中存在有环路"<<endl;*/
}
return 0;
}