1459.排位---------拓扑排序

本文深入探讨了游戏开发领域的核心技术,包括游戏引擎、动画、3D空间视频等,并结合实际案例进行详细解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Time Limit: 2000 MS         Memory Limit: 65536 K
Total Submissions: 226 (73 users)         Accepted: 53 (49 users)
[ My Solution]

Description
在竞技比赛中, 为了衡量一支队伍在比赛中的能力水平, 我们常常需要使用到排位顺序的概念, 其中, 排位越靠前的队伍, 能力越强。现在, 已知n支队伍参加了某项比赛和其中一些队伍排位的先后次序关系, 你能确定出这些队伍的排名情况吗?

Input
输入的第一行有2个整数n, m (2 <= n <= 100,000, 0 <= m <= 200,000), 接下来有m行, 每行两个正整数x, y (1 <= x, y <= n, 且 x != y)代表编号为x的队伍的排位在编号为y的队伍之前。

Output
如果任何一种排位顺序都不满足要求, 则输出-1, 否则, 请按排位的先后顺序输出n支队伍的编号, 每两个数字之间保留一个空格, 若存在多种满足题意的排位顺序, 则输出任意一种都可以通过本题。

Sample Input
4 3
3 4
2 1
1 3

Sample Output
2 1 3 4

Hint
这是一道SPECIAL JUDGE的题目, C++建议使用scanf读入, printf输出
 
 
 
 

#include<stdio.h>
#include<string.h>
int c[100002];
#define MAXN 100005
#define MAXE 400005
struct Edge{
 int node;
 int next;
}edge[MAXE];
int head[MAXN], cnt;
void add(int a, int b)
{
 edge[cnt].next = head[a], edge[cnt].node = b; head[a] = cnt++;

}
int ans[MAXN];
int vis[MAXN];
void fun(int i)
{
   ans[cnt++] = i;
   vis[i] = 1;
   for(int j = head[i]; ~j; j = edge[j].next)
   {
    if(!(--c[edge[j].node]))
     fun(edge[j].node);
   }
   return ;
}
int main()
{
 int n,m;
 while(scanf("%d %d",&n,&m)!=EOF){
  memset(c,0,sizeof(c));
  memset(vis, 0, sizeof(vis));
  //memset(s,0,sizeof(s));
  int i,a,b;
  memset(head, -1, sizeof(head));
  cnt = 0;
  for(i=0;i<m;i++){
   scanf("%d %d",&a,&b);
   add(a, b);
  // printf("%d %d\n",edge[cnt].node,edge[cnt].next);
   c[b]++;
  }

  cnt = 0;
  for(i=1;i<=n;i++)
  {
   if(!c[i] && !vis[i])
   {
    fun(i);
   }
  }
  if(cnt != n)
   printf("-1\n");
  else
  {
   printf("%d", ans[0]);
   for(i = 1; i < cnt; ++i)
    printf(" %d", ans[i]);
   printf("\n");
  }

 }
 return 0;
}

 

 

 

/*邻接表*/

#include<stdio.h>
#include<malloc.h>
#include<queue>
using namespace std;
int m,n;
const int mmax=100100;
struct haha
{
    int son;
    struct haha *nextson;
}*e[mmax];
int in[mmax],ans[mmax];
void add_edge(int x,int y)
{
       struct haha *p;
       p=(struct haha *)malloc(sizeof(struct haha));
       p->son=y;
       p->nextson=e[x];
       e[x]=p;
}
int main()
{
    int i,x,y,num,cnt;
    while(scanf("%d %d",&n,&m)!=EOF)
    {
        num=n;cnt=0;
        for(i=1;i<=n;i++)
        {
            e[i]=NULL;
            in[i]=0;
        }
        for(i=1;i<=m;i++)
        {
            scanf("%d %d",&x,&y);
            add_edge(x,y);
            in[y]++;
        }
        priority_queue<int,vector<int>,greater<int> >duilie;//注意这里要把》 》 分开 写
        for(i=1;i<=n;i++)
            if(in[i]==0) duilie.push(i);
            while(!duilie.empty())
            {
                x=duilie.top();
                duilie.pop();
                ans[cnt++]=x;
                struct haha *p;
                p=e[x];
                while(p!=NULL)
                {
                    if(--in[p->son]==0) duilie.push(p->son);
                    p=p->nextson;
                }
            }
            if(cnt!=n) {printf("-1\n");continue;} 
            for(i=0;i<cnt-1;i++)
                printf("%d ",ans[i]);
            printf("%d\n",ans[cnt-1]);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值