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;
}
思路:要使每一个数前面下标最小值尽量大,只要满足大的数尽量在前面就好了。按照这样的策略,其实就是一个简单的拓扑排序了。此外,由于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;
}
相关文章推荐
- hdu5695 贪心+拓扑排序
- hdu5695-优先队列&拓扑排序-Gym Class
- HDU5695-Gym Class-拓扑排序优先队列结合
- hdu5695 拓扑排序
- hdu5695 Gym Class(拓扑排序+优先)
- 【POJ】3687【拓扑排序】【LabelingBalls】
- 【算法导论】邻接表存储的拓扑排序
- 拓扑排序
- POJ 2585 拓扑排序
- All Discs Considered(拓扑排序)
- ACMclub - 1122 关系推断 (拓扑排序, 并查集)
- Poj 2367 Genealogical tree(拓扑排序)
- poj 1094 Sorting It All Out 拓扑排序
- zoj 3780 拓扑排序
- [POJ 3687] Labeling Balls [拓扑排序]
- SGU 230 拓扑排序
- hdu 2647(拓扑排序)
- POJ3687Labeling Balls(拓扑排序)
- 有向无环图(DAG)拓扑排序的两种方法
- 算法7-10:拓扑排序