bzoj 4010: [HNOI2015]菜肴制作 拓扑排序
4010: [HNOI2015]菜肴制作
Time Limit: 20 Sec Memory Limit: 256 MB
题目连接
http://uoj.ac/problem/67
Description
知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴。
Input
第一行是一个正整数D,表示数据组数。
Output
输出文件仅包含 D 行,每行 N 个整数,表示最优的菜肴制作顺序,或
Sample Input
3
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
1 5 3 4 2
Impossible!
1 5 2 4 3
HINT
题意
题解:
拓扑排序问题,由于他要输出一个字典序最小的,那么我们就用优先队列优化一下就好了
代码:
//qscqesze #include <cstdio> #include <cmath> #include <cstring> #include <ctime> #include <iostream> #include <algorithm> #include <set> #include <vector> #include <sstream> #include <queue> #include <typeinfo> #include <fstream> #include <map> #include <stack> typedef long long ll; using namespace std; //freopen("D.in","r",stdin); //freopen("D.out","w",stdout); #define sspeed ios_base::sync_with_stdio(0);cin.tie(0) #define maxn 200001 #define mod 10007 #define eps 1e-9 int Num; char CH[20]; //const int inf=0x7fffffff; //нчоч╢С const int inf=0x3f3f3f3f; /* inline void P(int x) { Num=0;if(!x){putchar(‘0‘);puts("");return;} while(x>0)CH[++Num]=x%10,x/=10; while(Num)putchar(CH[Num--]+48); puts(""); } */ inline ll read() { ll x=0,f=1;char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();} return x*f; } inline void P(int x) { Num=0;if(!x){putchar(‘0‘);puts("");return;} while(x>0)CH[++Num]=x%10,x/=10; while(Num)putchar(CH[Num--]+48); puts(""); } //************************************************************************************** int head[maxn]; int top; int d[maxn]; priority_queue<int>q; struct edge { int v,next; }e[maxn]; int cnt; int ans[maxn]; int n,m; void insert(int u,int v) { e[cnt].v=v; e[cnt].next=head[u]; head[u]=cnt; cnt++; } void solve(int x) { q.pop(); ans[++top]=x; for(int i=head[x];i>=0;i=e[i].next) { d[e[i].v]--; if(d[e[i].v]==0) q.push(e[i].v); } } int main() { //freopen("test.txt","r",stdin); int t=read(); while(t--) { n=read(),m=read(); cnt=top=0; memset(head,-1,sizeof(head)); memset(d,0,sizeof(d)); for(int i=1;i<=m;i++) { int u=read(),v=read(); insert(v,u); d[u]++; } for(int i=1;i<=n;i++) if(!d[i]) q.push(i); while(!q.empty()) { solve(q.top()); } if(top!=n) printf("Impossible!\n"); else { for(int i=n;i;i--) printf("%d ",ans[i]); printf("\n"); } } return 0; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。