您的位置:首页 > 其它

hdu5695 拓扑排序

2018-01-02 10:57 148 查看
题意:给定n个数和m个拓扑关系,要求从符合条件的拓扑序列中求,每一个数前面下标最小值之和的最大值。

思路:要使每一个数前面下标最小值尽量大,只要满足大的数尽量在前面就好了。按照这样的策略,其实就是一个简单的拓扑排序了。此外,由于n较大,所以选择queue进行优化。

附:优先队列的使用,priority_queue<>,默认大的值优先,正好满足题目要求。如果要小的值优先:

int类型:priority_queue<int,vector<int>,greater<int> >

结构体类型:重载一下<运算符就好。

=》priority_queue<类型,vector<类型>,比较函数 >



久违的1A,心情舒畅!

ac代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cmath>
#include<string>
using namespace std;

typedef long long ll;
const int maxn=1e5+5;
const ll mod=1000000007;

struct node{
int pos;
};
vector<int> a[maxn];
int deg[maxn];
ll ans,mx;
void init(int n){
for(int i=1;i<=n;i++) a[i].clear();
memset(deg,0,sizeof(deg));
ans=0;
mx=0x3f3f3f3f3f3f3f3f;
}
void topo(int n){
priority_queue<int> q;
for(int i=n;i>=1;i--){
if(!deg[i]) q.push(i);
}
while(!q.empty()){
int t=q.top();q.pop();
mx=min(mx,(ll)t);
ans+=mx;
for(int i=0;i<a[t].size();i++){
int k=a[t][i];
deg[k]--;
if(deg[k]==0) q.push(k);
}
}
printf("%I64d\n",ans);
}
int main(){
int T;scanf("%d",&T);
while(T--){
int n,m,f,t;
scanf("%d %d",&n,&m);
init(n);
while(m--){
scanf("%d%d",&f,&t);
a[f].push_back(t);
deg[t]++;
}
topo(n);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: