讨论 / 这题是拓扑排序吧 为什么我只AC了40
DarryRing 2016-05-23 06:41:45
点我顶贴 收藏 删除
#include<iostream>

#include<queue>

#include<vector>

#include<string.h>

using namespace std;

vector<int> data[11]; //拓扑序列

int indegree[11]; //每个节点的入度数组

int n;

queue<int> Q; //维护队列

string path=""; //保存拓扑序列

int pre[11]; //记录前一节点

bool flag=false; //是否找到

void pf(int now)

{

if(now==-1)

return ;

pf(pre[now]);

cout<<now<<" ";

}

void topo()

{

while(!Q.empty())

{

int now=Q.front(); //起点出队

Q.pop();

char ch=now+'0';

path+=ch;

if(ch=='1')

{

flag=true;

break; //找到了

}

indegree[now]=-1; //标记访问过的节点

for(int k=0;k<data[now].size();++k) //对邻接点的入度进行修改

{

int next=data[now][k];

indegree[next]--; //入度减1

if(indegree[next]==0) //入度为0

{

pre[next]=now;

Q.push(next); //next节点入队

}

}

}

}

int main()

{

memset(indegree,0,sizeof(indegree));

cin>>n; //输入节点数

for(int i=2;i<=n+1;++i)

{

int k;

cin>>k; //数据数目

indegree[i-1]=k; //计算入度

if(indegree[i-1]==0)

{

Q.push(i-1); //入队

pre[i-1]=-1; //初始起点的前一节点为-1

}

for(int j=0;j<k;++j)

{

int temp;

cin>>temp;

data[temp].push_back(i-1); //构图

}

}

topo();

if(flag)

pf(1);

else

cout<<"What a poor boy!"<<endl;

return 0;

}

这是我写的,大家看下哪里有问题。求指教!

查看更多回复
提交回复