题目链接:http://poj.org/problem?id=3687
题意:有n个小球,编号为1到n,让你给这些小球分配重量,首先若果没有明确说明哪个比哪个轻的话,那么编号越小的越轻,输入会告诉你m组关系,表示哪个小球比哪个轻,现在让你给这些小球排序,输出编号1到n的小球排完序后各个小球所在的位置
解析:这题和hdu4857很像,只不过输出变动一下就可以了
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
const int maxn = 205;
int in[maxn];
int ans[maxn];
vector<int>G[maxn];
int main(void)
{
int t,n,m;
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)
G[i].clear();
memset(in,0,sizeof(in));
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d %d",&x,&y);
G[y].push_back(x);
in[x]++;
}
priority_queue<int>q;
for(int i=1;i<=n;i++)
{
if(in[i]==0)
q.push(i);
}
int cnt = n;
while(!q.empty())
{
int u = q.top();
q.pop();
ans[u] = cnt;
cnt--;
for(unsigned i = 0;i<G[u].size();i++)
{
int v = G[u][i];
in[v]--;
if(in[v]==0)
q.push(v);
}
}
if(cnt!=0)
{
puts("-1");
continue;
}
for(int i=1;i<=n;i++)
{
if(i==n)printf("%d\n",ans[i]);
else printf("%d ",ans[i]);
}
}
return 0;
}

本文解析了POJ 3687题目中的小球排序问题,介绍了如何通过拓扑排序解决该问题,并给出了完整的C++代码实现。此算法根据输入的关系确定每个小球的轻重顺序。

536

被折叠的 条评论
为什么被折叠?



