拓扑排序模板-每次找入度为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;
}
#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;
}
相关文章推荐
- javascript学习笔记-3
- exploit - simple stack overflow - BlazeDVD Pro player 6.1
- Cport 详细解释和应用
- 用链表写的拓扑排序模板
- Oracle 数据库安装总结(个人亲测)
- sprintf的用法
- Java学习日记之掌控硬盘(2)
- C++ 记录Windows程序崩溃时的dumpfile
- 心存感恩
- C#面向对象第六天总结
- linux shell脚本学习xargs命令使用详解
- (PHP)微信公众平台模拟登陆和发送消息详解
- QT入门心得
- pyQT实现自动找茬游戏
- 使用sysfs创建LED驱动
- 第二十三讲 用if语句实现分支结构
- 【华为oj】图片整理
- 批量取出PHP BOM头
- python模块学习:os模块
- Redis数据类型之LIST类型