Gym Class

Time Limit: 6000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 681    Accepted Submission(s): 271


Problem Description
众所周知,度度熊喜欢各类体育活动。

今天,它终于当上了梦寐以求的体育课老师。第一次课上,它发现一个有趣的事情。在上课之前,所有同学要排成一列, 假设最开始每个人有一个唯一的ID,从1到N ,在排好队之后,每个同学会找出包括自己在内的前方所有同学的最小ID,作为自己评价这堂课的分数。麻烦的是,有一些同学不希望某个(些)同学排在他(她)前面,在满足这个前提的情况下,新晋体育课老师——度度熊,希望最后的排队结果可以使得所有同学的评价分数和最大。
 

 

Input
第一行一个整数T ,表示T(1T30) 组数据。

对于每组数据,第一行输入两个整数NM(1N100000,0M100000) ,分别表示总人数和某些同学的偏好。

接下来M 行,每行两个整数AB(1A,BN) ,表示ID为A 的同学不希望ID为B 的同学排在他(她)之前。你可以认为题目保证至少有一种排列方法是符合所有要求的。
 

 

Output
对于每组数据,输出最大分数 。
 

 

Sample Input
3
1 0
2 1
1 2
3 1
3 1
 
 

 

Sample Output
1
2
6
 
Source
 
题意:中文题面
 
题解: 拓扑排序+优先队列
         两个姿势复习一遍
         注意代码中标记的wa点
 
 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<queue>
 5 #include<stack>
 6 #include<vector>
 7 #include<map>
 8 #define ll __int64
 9 using namespace std;
10 vector<int> mp[100005];
11 int in[100005];
12 int t;
13 int ans[100005];
14 int vis[100005]; 
15 struct node
16 {
17     int x;
18     friend bool operator < (node aa,node bb)
19     {
20         return aa.x<bb.x;
21     }
22 };
23 priority_queue<node> p;
24 int n,m,a,b;
25 int main()
26 {
27     while(scanf("%d",&t)!=EOF)
28     {
29         for(int i=1;i<=t;i++)
30         {
31             scanf("%d %d",&n,&m);
32             int jishu=1;
33             struct node exm;
34             memset(ans,0,sizeof(ans));
35             for(int j=1;j<=n;j++)
36             {
37             mp[j].clear();
38             in[j]=0;
39             vis[j]=0;
40             }
41             for(int j=1;j<=m;j++)
42             {
43                 scanf("%d %d",&a,&b);
44                 mp[a].push_back(b);
45                 in[b]++;
46             }
47             for(int j=1;j<=n;j++)
48             {
49                 if(in[j]==0)
50                 {
51                     exm.x=j;
52                     vis[j]=1;
53                     p.push(exm);
54                 }
55             }
56             while(!p.empty())
57             {
58                 exm=p.top();
59                 ans[jishu++]=exm.x;
60                 p.pop();
61                 for(unsigned int j=0;j<mp[exm.x].size();j++)
62                 {
63                     if(--in[mp[exm.x][j]]==0&&vis[mp[exm.x][j]]==0)
64                     {  
65                         vis[mp[exm.x][j]]==1;
66                         struct node ggggg;////wa点
67                         ggggg.x=mp[exm.x][j];
68                         p.push(ggggg);
69                     }
70                 }    
71             }
72             int minx=ans[1];
73             ll gg=ans[1];
74             for(int j=2;j<=n;j++)
75             {
76                 minx=min(minx,ans[j]);
77                 gg+=minx; 
78             } 
79             printf("%I64d\n",gg);    
80         }
81     }    
82     return 0;
83 }