您的位置:首页 > 其它

拓扑排序模板-每次找入度为0的点都循环每一个点

2015-06-19 21:26 267 查看
#include <iostream>

#include <cstdio>

#include <cstring>

#include <vector>

#define nMAX 510

using namespace std;

vector<int> g[nMAX];//每个点的链表

int have[nMAX];//存每个点的入度

int main()

{

int i,j,k,n,m,x,y;

bool o;

while (~scanf("%d%d",&n,&m))

{

for (i = 1; i <= n; i++)//清空链表

{

g[i].clear();

}

memset(have, 0, sizeof(have));

while (m--)

{

scanf("%d%d",&x,&y);

g[x].push_back(y);//将y存到x的链表里面

have[y]++;

}

for (i = 0, o = false; i < n; i++)//循环n次

{

for (j = 1; j <= n; j++)

{

if (have[j] == 0)

{

o && printf(" ");

printf("%d",j);

o = true;

have[j] = -1;//删除j点

for (k = 0; k < g[j].size(); k++)//将g[j]链表里的所有的点的入度都减1

{

have[g[j][k]]--;

}

break;//每次找到一个就结束,并且总是在这个for循环之后加break,要每次找到之后才结束,不是每次循环直接结束。

}

}

}

printf("\n");

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: