有史以来我最坑的一次,hdu5195 DZY Loves Topological Sorting 拓扑序

来源:互联网 发布:网吧公告软件 编辑:程序博客网 时间:2024/05/19 12:24
//这题可算是历经千辛万苦才算ac了//建图,然后就拓扑序,//还是官方的bc的题解出的好//贪心取编号最大的点//令du[i]<=k的i进入优先队列//然后依次整就行了,//每次取出的点,判断一下//是否du[i]<=k,如果小于//依次遍历与他相邻的点,//在这些相邻的点中找到du[j]<=k//且不在队列当中的i的值,//开始用g++交题,一直TLE,//用高效一点的邻接表,还是TLE//然后用c++交题,结果。。。ac了//TLE了十多发。。。//发誓:以后只用c++交题了。。。555<img src="http://img.blog.csdn.net/20150329011213043?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVElNRUxJTUlURQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" height="40" width="326" alt="" />#include <cstdio>#include <cstring>#include <vector>#include <algorithm>#include <queue>#include <set>using namespace std;const int maxn = 1e5 + 50;vector<int> mp[maxn];int n,m,k;struct Edge{    int v;    int next;}edges[maxn];int adj[maxn];int edgenum;void addEdge(int u,int v){    edges[edgenum].v=v;    edges[edgenum].next=adj[u];    adj[u]=edgenum++;}int du[maxn];int a[maxn];int inq[maxn];int cnt;void tupo(){//    for (int i=1;i<=n;i++){//        set<int> st;//        for (int j=adj[i];j!=-1;j=edges[j].next){////            st.insert(edges[j].v);//            du[edges[j].v]++;//        }////        for (set<int>::iterator it=st.begin();it!=st.end();it++){////            du[*it]++;////        }//    }    priority_queue<int> que;//    for (int i=n;i>=1;i--)//        printf("%d ",du[i]);//    puts("");    for (int i=n;i>=1;i--){        if (du[i]<=k){            que.push(i);            inq[i]=1;            //k= k-du[i];            //du[i]=0;           // printf("k:%d\n",k);        }    }    int flag = 0;    while(!que.empty()){        int u = que.top();        que.pop();        if (k<du[u]){            inq[u]=0;            continue;        }        k-=du[u];       // a[cnt++]=u;        for (int i=adj[u];i!=-1;i=edges[i].next){            int t = edges[i].v;            du[t]--;            if (!inq[t]&&du[t]<=k){                inq[t]=1;                que.push(t);            }        }        if (flag)            putchar(' ');        flag = 1;        printf("%d",u);    }    puts("");}void init(){//    memset(du,0,sizeof(du));//    memset(inq,0,sizeof(inq));//    cnt=0;//    memset(adj,-1,sizeof(adj));    for (int i=1;i<=n;i++){        du[i]=0;        inq[i]=0;        adj[i]=-1;    }    edgenum=0;    while(m--){        int a,b;        scanf("%d%d",&a,&b);//        if (find(mp[a].begin(),mp[a].end(),b)!=mp[a].end())//            continue;        edges[edgenum].v=b;        edges[edgenum].next=adj[a];        adj[a]=edgenum++;        du[b]++;//        mp[a].push_back(b);    }    //for (int i=1;i<=n;i++)    //sort(mp[i],mp[i]+mp[i].size(),cmp);}void solve(){    tupo();}int main(){  //  freopen("G:\\Code\\1.txt","r",stdin);    while(scanf("%d%d%d",&n,&m,&k)!=EOF){        init();        solve();    }}

1 0