UESTC_排名表 2015 UESTC Training for Graph Theory<Problem I>

I - 排名表

Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)

Submit Status

暑假前集训已经过了一半了,我们将会把当前排名公布出来。但是此刻秋实大哥却心急火燎,因为他不慎把排名删除了。

一共有n个人参加排名,每个人都有一个名次,没有哪两个人的名次是相同的。现在秋实大哥掌握的一些情报,比如Ai的名次要先于Bi。(编号从1开始)

你能帮秋实大哥恢复出排名表吗?

Input

第一行一个数字 T (T≤10),表示测试数据组数

每组测试数据,第一行两个数 n(1≤n≤200)和 m(0≤m≤40000),接下来m行,每行两个数a和b(1≤a,b≤N),表示a的名次要先于b

Output

对于每组测试数据,输出一行,从1号到n号每个人的名次。

如果有多个解,让编号为1的人的名次尽量小,然后让编号为2的人的名次尽量小,然后让编号为3的人的名次尽量小......

如果没有解,输出−1

Sample input and output

Sample Input Sample Output
5
4 0
4 1
1 1
4 2
1 2
2 1
4 1
2 1
4 1
3 2
1 2 3 4
-1
-1
2 1 3 4
1 3 2 4

Hint

注意可能会有重边

解题思路:

首先,本题正向拓扑排序是不行的,即如果这样建边:

U 的名次先于 V , 即 V 向 U连边

因为题意比较绕,下文都这样叙述:

排名号越高,其名次越低,第一名的排名号是 1 ,它的名次是最高的.

我们按照 v 向 u建边,意思是v的排名号高于u.

无法保证

让编号为1的人的名次尽量小,然后让编号为2的人的名次尽量小,然后让编号为3的人的名次尽量小.

è 让编号为 1 的人的排名号尽量大,然后让编号为 2 的人的排名号尽量大….

我们拓扑排序的顺序是这样的:

每次寻找入度为 0 的点,将排名号赋给这个点,删边,重复.

如果有多个点入度都是 0 呢?我们不假思索的这样想:

 我们为了保证题目条件,会使得我们会尽量保证这个点的编号尽量小(这样我们看起来符合了题目条件:编号小的人排名号尽量高),但是我们忽略了,题目要求是先尽力保证编号1的人,之后才是编号2的人….

所以,正向建边是错误的

注意,上面的证明非常不严格(Even it‘s a mistake),如果小伙伴谁有更好的证明,可在下面回复

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#define pb push_back
using namespace std;
const int maxn = 200 + 10;
int n,m,c[maxn],indig[maxn];
vector<int>E[maxn];
bool existedge[maxn][maxn];
int out[maxn];

bool dfs(int cur)
{
   if (c[cur] == 1)
    return true;
   c[cur] = -1;
   for(int i = 0 ; i < E[cur].size() ; ++ i)
    {
        int nextnode = E[cur][i];
        if (c[nextnode] == -1)
         return false;
        if (!c[nextnode] && !dfs(nextnode)) //exist 环
         return false;
    }
   c[cur] = 1;
   return true;
}

typedef struct point
{
  int id,indig;
  friend bool operator < (const point & x,const point & y)
   {
         return x.indig < y.indig;
   }
  point(int id,int indig)
   {
        this->id = id , this->indig = indig;
   }
};

vector<point>v;
bool used[maxn];

void ansset()
{
   memset(used,false,sizeof(used));
   for(int i = 1 ; i <= n ; ++ i)
    v.pb(point(i,indig[i]));
   sort(v.begin(),v.end());
   int rank = 0;
   for(int i = 1 ; i <= n ; ++ i)
    {
       int choose = v[0].id;
       int pos = 0;
       while( pos < v.size() && !v[pos].indig)
        choose = max(choose,v[pos++].id);
       out[choose] =  n - rank++;
       used[choose] = true;
       for(int i = 0 ; i < E[choose].size() ; ++ i)
        indig[E[choose][i]]--;
       v.clear();
       for(int i = 1 ; i <= n ; ++ i)
        if(!used[i])
         v.pb(point(i,indig[i]));
       sort(v.begin(),v.end());
    }
}

int main(int argc,char *argv[])
{
  int Case;
  scanf("%d",&Case);
  while(Case--)
   {
         scanf("%d%d",&n,&m);
         memset(c,0,sizeof(c));
         memset(existedge,false,sizeof(existedge));
         memset(indig,0,sizeof(indig));
         while(m--)
          {
                int u,v;
                scanf("%d%d",&u,&v);
                if (existedge[v][u])
                 continue;
                E[v].pb(u);
                existedge[v][u] = true;
                indig[u] ++;
       }
      int ans = 1;
      for(int i = 1 ; i <= n ; ++ i)
       if (!dfs(i))
           {
              ans = 0;
           break;
        }
       if (!ans)
        printf("-1\n");
       else
        {
           v.clear();
           ansset();
           for(int i = 1 ; i <= n ; ++ i)
            i == 1 ? printf("%d",out[i]) : printf(" %d",out[i]);
           printf("\n");
        }
       for(int i = 1 ; i <= n ; ++ i)
        E[i].clear();
   }
  return 0;
}
时间: 2024-10-04 05:45:12

UESTC_排名表 2015 UESTC Training for Graph Theory<Problem I>的相关文章

UESTC_传输数据 2015 UESTC Training for Graph Theory&lt;Problem F&gt;

F - 传输数据 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 机房里面有m台电脑,n台网线,每条网线都每秒中最多传送的数据量,现在需要你计算从标号为1的电脑传送数据到编号为m的电脑,问一秒内最多传送多少数据? Input 第1行: 两个用空格分开的整数N(0≤N≤200)和 M(2≤M≤200).N网线的数量,M是电脑的数量. 第二行到第N+1行

UESTC_方老师和农场 2015 UESTC Training for Graph Theory&lt;Problem L&gt;

L - 方老师和农场 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 方老师重新开了一家农场,农场一共有N个节点和M条双向边,但是有一个很大的问题就是有比如一个农场A到达农场B只有一条路径,问至少添加多少条边使得任意两个农场之间的路径多于一条. Input 多组数据,EOF结束. 第1行:N和M. 第2到第M+1行:每一行2个数Ui和Vi,表示Ui到

UESTC_秋实大哥带我飞 2015 UESTC Training for Graph Theory&lt;Problem B&gt;

B - 秋实大哥带我飞 Time Limit: 300/100MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 然而题目和题面并没有什么关系. 给出n个点,m条带权无向边,问你从1号点到n号点的最短路中有多少种走法? Input 第一行两个数n,m分别表示点的个数和边的个数. (2≤n≤2000,1≤m≤2000) 接下来m行,每行3个数u,v,w表示u号点到v号点有一条距离为w的边.(1≤u

UESTC_秋实大哥与连锁快餐店 2015 UESTC Training for Graph Theory&lt;Problem A&gt;

A - 秋实大哥与连锁快餐店 Time Limit: 9000/3000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 成大事者,不惟有超世之才,亦有坚忍不拔之志. 秋实大哥开了一家快餐店之后,由于人赢光环的影响,很快就赚得了大量的资金.为了继续实现心中的远大的理想,他打算在全国各地开设分店赚大钱.假设现在有n家快餐店(其中有至少有一家是旗舰店)分布在二维平面上,第i家快餐店的坐标为(xi,

UESTC_树上的距离 2015 UESTC Training for Graph Theory&lt;Problem E&gt;

E - 树上的距离 Time Limit: 2000/1000MS (Java/Others)     Memory Limit: 262143/262143KB (Java/Others) Submit Status 给你一棵带权树,边权表示两点间的距离.有如下两种操作: 询问两点间的最短距离. 修改一条边权值. 对每个操作1,回答两点间的距离. Input 第一行一个数n,表示点的个数.接下来n−1行,每行3个数u,v,w,表示u,v间有权为w的边.边按照输入顺序从1到n−1编号.输入保证为

UESTC_韩爷的情书 2015 UESTC Training for Graph Theory&lt;Problem H&gt;

H - 韩爷的情书 Time Limit: 6000/2000MS (Java/Others)     Memory Limit: 262144/262144KB (Java/Others) Submit Status 某年某月某日,韩爷被妹子表白了\o/ 同时,韩爷收到了来自妹子的情书.在好奇心的驱使下,众人想要一览究竟. 显然,羞涩韩爷是不会把情书直接拿出来的. 假设情书长度为n+2,韩爷从中提取出n个长度为3的连续字符串,分给了n个人. 现在这n个人向你求助,能否帮他们把情书恢复出来. I

UESTC_秋实大哥与时空漫游 2015 UESTC Training for Graph Theory&lt;Problem C&gt;

C - 秋实大哥与时空漫游 Time Limit: 4500/1500MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 秋实大哥通过全国的连锁快餐店发家致富,赚了大钱,接下来他打算通过这些钱实现他的另一个梦想————遨游太空,漫游星际. 秋实大哥满怀期待的出发了. .......啦啦啦啦啦啦啦啦啦...... 最后,秋实大哥花完了钱,觉得是时候回地球继续赚钱和过节了. 但是却被告知回地球的专机

UESTC_小panpan学图论 2015 UESTC Training for Graph Theory&lt;Problem J&gt;

J - 小panpan学图论 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 小panpan不会图论,所以图论专题他非常刻苦地学习图论. 今天他认真地学习了萌神的ppt,学习了一下Floyd算法,手持两把锟斤拷的他, 口中疾呼烫烫烫,马上找了到OJ上找了道FLoyd的题: n个点,m边的无向连通图,无重边,无自环,每条边的长度都是1,求任意两点之间的

UESTC_邱老师的脑残粉 2015 UESTC Training for Graph Theory&lt;Problem D&gt;

D - 邱老师的脑残粉 Time Limit: 12000/4000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 邱老师的粉丝众多,每天邱老师都得面对粉丝们数不尽的邀约,邱老师一个人处理不过来,所以想请你帮忙. 假设某天有N个粉丝想和邱老师约,一旦某个粉丝成功地约上了邱老师,她就会发微博和朋友炫耀.一旦某个粉丝发现微博里有关于邱老师的消息,她都会转发. 如果当天内某个约上邱老师的粉丝发现微