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

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

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
const int maxn = 1e5 + 50;
vector 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 st;
//        for (int j=adj[i];j!=-1;j=edges[j].next){
            st.insert(edges[j].v);
//            du[edges[j].v]++;
//        }
        for (set::iterator it=st.begin();it!=st.end();it++){
            du[*it]++;
        }
//    }
    priority_queue 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

你可能感兴趣的:(有史以来我最坑的一次,hdu5195 DZY Loves Topological Sorting 拓扑序)