您的位置:首页 > 其它

HDU 1285 确定比赛名次 (拓扑排序)

2015-08-18 09:51 92 查看
基础题,不多说。。

//#pragma comment(linker, "/STACK:102400000,102400000")
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long LL;
const long long mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const int M = 1050;

vector<int>G[M];
int n, m, indegree[M],q[M];

int toposort()
{
int i, j, k;
i=0;
while(i<n)
{
for(j=1; j<=n; j++)
{
if(indegree[j] == 0)
{
indegree[j]--;
q[i++] = j;
for(k=1; k<=n; k++)  //删除相关的边
if(G[j][k])
indegree[k]--;
break;
}
}
}

return 1;
}

int main()
{
int i, a, b;
while(scanf("%d%d", &n, &m) == 2)
{
memset(G, 0, sizeof(G));
for(int i=0;i<M;++i)
{
G[i].clear();
}

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

for(i=1; i<=m; i++)
{
scanf("%d %d", &a, &b);
if(G[a][b] == 0)
{
G[a][b] = 1;
indegree[b]++;
}

}
toposort();
for(i=0; i<n; i++)
{
if(i != n-1)
printf("%d ", q[i]);
else
printf("%d\n", q[i]);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: