HDOJ4857【拓扑排序】

来源:互联网 发布:淘宝接单的app都有哪些 编辑:程序博客网 时间:2024/06/05 19:18

首先 CLJ ORZ
这道题做了两次,第一次瞎搞。。。
第二次,好吧,骄傲地说水过。。。
题意:不说了;
思路:
题目默认是小的在前面,那么就是反向建图,每次排序拿大的出来;

第一次做的时候,我记得我的思路是:还是正向建图,然后每次拿小的出来,天真啊,年轻啊,一个例子:1->3->4和5->2,很明显最终的排序,应该是1,5,2,3,4,其实一开始我还看过题解不理解为什么会这样,我还是理解成1,3,4,6,2,但是你得明白小的在前面,你看例子,{1,3,4}和{6,2}是两个独立的集合,2和3,4没有关系,所以3,4在2后面,那么首先就是要6在前面。所以有上面的方法;

code:

#include<stdio.h>#include<iostream>#include<cstdio>#include<queue>#include<stack>#include<cmath>#include<cstring>#include<cstdlib>#include<climits>#include<algorithm>using namespace std;#define ll unsinged long long#define PI acos(-1.0)#define ING 0x7fffffff#define INF 0x3f3f3f3f#define mod 1000000007#define N  301000struct asd{    int to;    int next;};asd q[N];int head[N],tol;int vis[N];int d[N];int pre[N];int n,m;int ans[N];int num;void add(int a,int b){    q[tol].to=b;    q[tol].next=head[a];    head[a]=tol++;  }void tuopu(){    priority_queue<int>que;  //默认优先级是从大到小;    while(!que.empty())        que.pop();    for(int i=1;i<=n;i++)    {        if(!d[i])            que.push(i);    }    num=0;    while(!que.empty())    {        int u=que.top();        que.pop();        ans[num++]=u;        for(int k=head[u];k!=-1;k=q[k].next)        {            int i=q[k].to;            d[i]--;            if(!d[i])                que.push(i);        }    }    for(int i=num-1;i>0;i--)    {        printf("%d ",ans[i]);    }    printf("%d\n",ans[0]);}int main(){    int t;    scanf("%d",&t);    while(t--)    {        scanf("%d%d",&n,&m);        tol=0;        memset(head,-1,sizeof(head));        memset(d,0,sizeof(d));        for(int i=0;i<m;i++)        {            int a,b;            scanf("%d%d",&a,&b);            d[a]++;            add(b,a);        }        tuopu();    }    return 0;}
0 0
原创粉丝点击