标签:hdu5195 dzy loves topologica 拓扑排序
//这题可算是历经千辛万苦才算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(); } }
有史以来我最坑的一次,hdu5195 DZY Loves Topological Sorting 拓扑序
标签:hdu5195 dzy loves topologica 拓扑排序
原文地址:http://blog.csdn.net/timelimite/article/details/44713775