//这题可算是历经千辛万苦才算ac了
//建图,然后就拓扑序,
//还是官方的bc的题解出的好
//贪心取编号最大的点
//令du[i]<=k的i进入优先队列
//然后依次整就行了,
//每次取出的点,判断一下
//是否du[i]<=k,如果小于
//依次遍历与他相邻的点,
//在这些相邻的点中找到du[j]<=k
//且不在队列当中的i的值,
//开始用g++交题,一直TLE,
//用高效一点的邻接表,还是TLE
//然后用c++交题,结果。。。ac了
//TLE了十多发。。。
//发誓:以后只用c++交题了。。。555<img src="https://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 拓扑序
最新推荐文章于 2019-04-03 14:50:33 发布