zoukankan      html  css  js  c++  java
  • Luogu P3243 菜肴制作

    Luogu P3243 菜肴制作

    这明明是一道带字典序的拓扑排序,结果还上到紫题……
    至于判断是否无解,只需要再拓扑排序完,遍历一遍有没有入度不为$0$的点。如果有,就说明无解。

    #include<bits/stdc++.h>
    #define N 100010
    
    using namespace std;
    
    int d,n,m,cnt,tot;
    int in[N],ans[N],head[N];
    struct node {
    	int nxt,to;
    }edge[N];
    
    void addEdge(int u,int v) {
    	edge[++tot]=(node){head[u],v};
    	head[u]=tot;
    	in[v]++;
    	return;
    }
    
    void Init() {
    	cnt=0;
    	tot=0;
    	memset(in,0,sizeof(in));
    	memset(ans,0,sizeof(ans));
    	memset(head,0,sizeof(head));
    	memset(edge,0,sizeof(edge));
    	return;
    }
    
    void Read() {
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=m;i++) {
    		int u,v;
    		scanf("%d%d",&u,&v);
    		addEdge(v,u);
    	}
    	return;
    }
    
    void Topo() {
    	priority_queue <int> q;
    	for(int i=1;i<=n;i++) {
    		if(!in[i]) {
    			q.push(i);
    		}
    	}
    	while(!q.empty()) {
    		int t=q.top();
    		q.pop();
    		ans[++cnt]=t;
    		for(int i=head[t];i;i=edge[i].nxt) {
    			int t=edge[i].to;
    			in[t]--;
    			if(!in[t]) {
    				q.push(t);
    			}
    		}
    	}
    	return;
    }
    
    void Print() {
    	for(int i=1;i<=n;i++) {
    		if(in[i]) {
    			printf("Impossible!
    ");
    			return;
    		}
    	}
    	for(int i=cnt;i>=1;i--) {
    		printf("%d ",ans[i]);
    	}
    	printf("
    ");
    	return;
    }
    
    int main()
    {
    	scanf("%d",&d);
    	for(int i=1;i<=d;i++) {
    		Init();
    		Read();
    		Topo();
    		Print();
    	}
    	return 0;
    }
    
  • 相关阅读:
    SOJ 2785_Binary Partitions
    Codeforces Round #328 (Div. 2)
    C++ fill 和memset
    SOJ 2749_The Fewest Coins
    Codeforces Round #327 (Div. 2)
    TYVJ P1013 找啊找啊找GF Label:动态规划
    TYVJ 1014 乘法游戏
    TYVJ 1011 NOIP 2008&&NOIP 2000 传纸条&&方格取数 Label:多线程dp
    错误集合
    TYVJ P1038/P1039 忠诚 标签:线段树
  • 原文地址:https://www.cnblogs.com/luoshui-tianyi/p/12194585.html
Copyright © 2011-2022 走看看