您的位置:首页 > 其它

HDU 1285 确定比赛名次

2012-08-02 18:23 239 查看
拓扑排序。

  (1)从有向图中选择一个没有前驱(即入度为0)的顶点并且输出它.   

  (2)从网中删去该顶点,并且删去从该顶点发出的全部有向边.   

  (3)重复上述两步,直到剩余的网中不再存在没有前趋的顶点为止.

代码如下:

#include<iostream>
#include<cstring>

using namespace std;

int main()
{
int i, j, k, n, m, a, b;
int dgr[501], map[501][501];    //dgr[]存放节点的入度
while(cin >> n >> m)
{
memset(dgr, 0, sizeof(dgr));
memset(map, 0, sizeof(map));
for (i=1; i<=m; i++)
{
cin >> a >> b;
if (map[a][b] == 0)     //重复 不计
{
map[a][b]=1;
dgr[b]++;
}
}
for (i=1; i<=n; i++)      //n次查找
for (j=1; j<=n; j++)
if (dgr[j] == 0)    //寻找入度为0的结点,并将其删除
{
dgr[j]=-1;
cout << j;
if (i == n) cout << endl;
else cout << " ";
for (k=1; k<=n; k++)    //更新以它为前驱结点的入度
if (map[j][k] == 1)
dgr[k]--;
break;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: