hdoj 4857 逃生 【拓扑排序 输出字典序最小解】

#include <cstdio>#include <vector>#include <cstring>#include <queue>#include <stack>#define MAXN 30000+10#define MAXM 300000+10using namespace std;struct Edge{int from, to, next;};Edge edge[MAXM];int head[MAXN], edgenum;int in[MAXN];int N, M;void init(){edgenum = 0;memset(head, -1, sizeof(head));memset(in, 0, sizeof(in));}void addEdge(int u, int v){int i;for(i = head[u]; i != -1; i = edge[i].next)//判重{if(edge[i].to == v)break;}if(i == -1)//没有重边才建边 + 记录入度{in[v]++;Edge E = {u, v, head[u]};edge[edgenum] = E;head[u] = edgenum++;}}void getEdge(){int a, b;while(M–){scanf("%d%d", &a, &b);addEdge(b, a);}}void solve(){priority_queue<int> Q;//大的优先stack<int> S;//输出for(int i = 1; i <= N; i++)if(in[i] == 0) Q.push(i);while(!Q.empty()){int u = Q.top();Q.pop();S.push(u);for(int i = head[u]; i != -1; i = edge[i].next){int v = edge[i].to;if(–in[v] == 0)Q.push(v);}}while(S.size() > 1){printf("%d ", S.top());S.pop();}printf("%d\n", S.top());S.pop();}int main(){int t;scanf("%d", &t);while(t–){scanf("%d%d", &N, &M);init();getEdge();solve();}return 0;}

,伟人之所以伟大,是因为他与别人共处逆境时,

hdoj 4857 逃生 【拓扑排序 输出字典序最小解】

相关文章:

你感兴趣的文章:

标签云: