拓扑排序
这题是要求N个点的一个拓扑序,且满足以下条件:编号1的位置尽可能靠前,在此基础上编号2的位置尽可能靠前……
我看到这题的第一感觉:将拓扑排序用的队列改为优先队列,编号越小越早出来。
但是连样例都过不了= =因为这样做是【字典序最小】,并不一定满足题目的条件(看样例就知道了,这样其实是早出队的元素编号尽量小,并不完全是编号小的早出队)
那么怎么搞呢?正着不行还不让我们反着来吗>_>
将所有边反向!搞逆拓扑序!这次我们让早出队的元素编号越大越好,也就是让编号越小的尽量靠后,因为在原序中靠前,就是在拓扑逆序中靠后。
然后就AC辣~
其实蒟蒻也不会证明……感性理解就是:对于编号小的元素,尽可能用编号比他大的进行拖延,让他晚出队,应该是有点贪心的思想吧= =
证明:http://zyfzyf.is-programmer.com/posts/89618.html
http://www.cnblogs.com/vb4896/p/4083650.html
P.S.这应该是这次胡策中最简单的一题了吧……反而放在C题的位置……
/**************************************************************
Problem: 4010
User: Tunix
Language: C++
Result: Accepted
Time:820 ms
Memory:4520 kb
****************************************************************/ //Huce #7 C
#include<queue>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
using namespace std; int getint(){
int v=,sign=; char ch=getchar();
while(ch<''||ch>'') {if (ch=='-') sign=-; ch=getchar();}
while(ch>=''&&ch<='') {v=v*+ch-''; ch=getchar();}
return v*sign;
}
typedef long long LL;
const int N=,INF=~0u>>;
/*******************template********************/
int to[N<<],next[N<<],head[N],cnt;
void add(int x,int y){
to[++cnt]=y; next[cnt]=head[x]; head[x]=cnt;
}
int n,m,du[N];
void init(){
n=getint(); m=getint();
cnt=; memset(head,,sizeof head);
memset(du,,sizeof du);
int x,y;
F(i,,m){
x=getint(); y=getint();
swap(x,y);
add(x,y); du[y]++;
}
}
int ans[N],tot;
void solve(){
priority_queue<int>Q;
F(i,,n) if (!du[i]) Q.push(i);
tot=;
while(!Q.empty()){
int x=Q.top(); Q.pop();
ans[++tot]=x;
for(int i=head[x];i;i=next[i]){
du[to[i]]--;
if (du[to[i]]==) Q.push(to[i]);
}
}
if (tot==n) {D(i,tot,) printf("%d ",ans[i]); puts("");}
else puts("Impossible!");
} int main(){
#ifndef ONLINE_JUDGE
freopen("C.in","r",stdin);
// freopen("output.txt","w",stdout);
#endif
int T=getint();
while(T--){
init();
solve();
}
return ;
}
4010: [HNOI2015]菜肴制作
Time Limit: 5 Sec Memory Limit: 512 MB
Submit: 267 Solved: 159
[Submit][Status][Discuss]
Description
知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴。
Input
第一行是一个正整数D,表示数据组数。
Output
输出文件仅包含 D 行,每行 N 个整数,表示最优的菜肴制作顺序,或
Sample Input
5 4
5 4
5 3
4 2
3 2
3 3
1 2
2 3
3 1
5 2
5 2
4 3
Sample Output
Impossible!
1 5 2 4 3
HINT
【样例解释】
Source