您的位置:首页 > 其它

POJ 3687 Labeling Balls

2011-02-14 22:20 281 查看
详细的报告见http://imlazy.ycool.com/post.2144071.html

关键的地方就是要让标号小的尽量往前放,对于平行路径,小的头部不一定排在前面,但大的尾部一定排在后面!

代码:

#include<iostream>
#include<queue>
#include<cstdio>
#include<memory.h>
using namespace std;
const int MAX=205;
struct node
{
int v,next;
}g[MAX*MAX];
int adj[MAX],out[MAX],res[MAX],wei[MAX];
int e,n,m;
int topsort()
{
priority_queue<int>que;
int i,u,v,cnt=n;
for(i=1;i<=n;i++)
if(out[i]==0)
que.push(i);
while(!que.empty())
{
u=que.top();
que.pop();
res[u]=cnt--;
for(i=adj[u];i!=-1;i=g[i].next)
{
v=g[i].v;
if(--out[v]==0)
que.push(v);
}
}
return cnt==0;
}
int main()
{
int i,j,T;
scanf("%d",&T);
while(T--)
{
e=0;
memset(adj,-1,sizeof(adj));
memset(out,0,sizeof(out));
scanf("%d%d",&n,&m);
while(m--)
{
scanf("%d%d",&i,&j);
out[i]++;
g[e].v=i;
g[e].next=adj[j];
adj[j]=e++;
}
//cout<<"yes"<<endl;
if(topsort())
{
for(i=1;i<=n;i++)
{
printf("%d ",res[i]);
}
printf("/n");
}
else
printf("-1/n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: