程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> XMU 1459 排位 拓撲排序 水題

XMU 1459 排位 拓撲排序 水題

編輯:C++入門知識

1459.排位
Time Limit: 2000 MS         Memory Limit: 65536 K
Total Submissions: 248 (75 users)         Accepted: 54 (50 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輸出

Source
doraemon @ xmu


題意:
輸入 n m
n個人   m個關系  
對於每個關系a b  表示a在b的前面 
問輸入這些之後  所有點的最後的前後順序應該是什麼   可以有多種答案  special judge

思路:
模板題 :拓撲排序
[cpp]
#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; 

#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;
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved