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,作为自己评价这堂课的分数。麻烦的是,有一些同学不希望某个(些)同学排在他(她)前面,在满足这个前提的情况下,新晋体育课老师——度度熊,希望最后的排队结果可以使得所有同学的评价分数和最大。
今天,它终于当上了梦寐以求的体育课老师。第一次课上,它发现一个有趣的事情。在上课之前,所有同学要排成一列, 假设最开始每个人有一个唯一的ID,从1到N ,在排好队之后,每个同学会找出包括自己在内的前方所有同学的最小ID,作为自己评价这堂课的分数。麻烦的是,有一些同学不希望某个(些)同学排在他(她)前面,在满足这个前提的情况下,新晋体育课老师——度度熊,希望最后的排队结果可以使得所有同学的评价分数和最大。
Input
第一行一个整数T
,表示T(1≤T≤30)
组数据。
对于每组数据,第一行输入两个整数N 和M(1≤N≤100000,0≤M≤100000) ,分别表示总人数和某些同学的偏好。
接下来M 行,每行两个整数A 和B(1≤A,B≤N) ,表示ID为A 的同学不希望ID为B 的同学排在他(她)之前。你可以认为题目保证至少有一种排列方法是符合所有要求的。
对于每组数据,第一行输入两个整数N 和M(1≤N≤100000,0≤M≤100000) ,分别表示总人数和某些同学的偏好。
接下来M 行,每行两个整数A 和B(1≤A,B≤N) ,表示ID为A 的同学不希望ID为B 的同学排在他(她)之前。你可以认为题目保证至少有一种排列方法是符合所有要求的。
Output
对于每组数据,输出最大分数 。
Sample Input
3
1 0
2 1
1 2
3 1
3 1
Sample Output
1
2
6
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 }