您的位置:首页 > 其它

九度:1449<拓扑排序><DAG>

2014-03-08 23:11 211 查看
http://ac.jobdu.com/problem.php?pid=1449

使用邻接矩阵实现方便。

// 1449
// 拓扑排序,小号尽量在前
//

#include <stdio.h>

#define SIZE 500+10

int edge[SIZE][SIZE]; //edge[], 用来存放下一个节点的编号
bool mark[SIZE];
int Q[SIZE]; //存放输出队列
void Init(int n)
{
for(int i=1; i<=n; i++)
{
mark[i] = false;
for(int j=1; j<= n; j++)
{
edge[i][j] = -1;
}
}
}

void Input(int m)
{
int p1, p2;
while(m-->0)
{
scanf("%d%d", &p1, &p2);
edge[p1][p2] = 1;// x->y
}
}

int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("E:\\in.txt", "r", stdin);
//freopen("E:\\out.txt", "w", stdout);
#endif

int n, m;
while(scanf("%d%d", &n, &m) != EOF)
{
if(n == 0 && m ==0)
{
break;
}

Init(n);
Input(m);

/// 核心部分
int num=0;
while(num < n)
{
int i, newP = -1;
for(i=1; i<=n; i++)
{
if( mark[i] == true)
{
continue;
}
int j;
for(j=1; j<=n; j++)
{
if(edge[j][i] != -1)
{
break;
}
}
if(j == n+1)
{
newP = i;
break;
}
}
if(newP != -1)
{
Q[num++] = newP;
mark[newP] = true;

int j;
for(j=1; j<=n ;j++)
{
edge[newP][j]=-1;
}
}
newP=-1;
}
int j;
for(j = 0; j<n; j++)
{
printf("%d", Q[j]);
if(j != n-1)
{
printf(" ");
}
else
{
puts("");
}
}
}//while

return 0;

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