hdu5638 秘之贪心

这道题是贪心吗?
我觉得有
删除k条边之后字典序最小的拓扑排序
我们就贪心的删边,使得删掉边之后得到最小的拓扑排序
好像有点废话….意思就是说,如果拓扑排序最小,当然就是1,2,3,4,5,6…..这种,我们想办法把答案往这个靠拢,怎么靠?如果1这个点的入度大于k,算了,惹不起,走…如果入度小于k的话,那1这个点就要乖乖脱下裤子,进入拓扑排序。反复进行,秘之贪心!

当然还有线段树的,也是一样的

#include
#include
using namespace std;
#include
#include
#include
typedef long long ll;
const ll mod=1e9 +7;
const int maxn=1e5 +5;
const int maxm=2e5 +5;
int deg[maxn];
vector<int> a[maxn];
bool used[maxn];
typedef pair<int,int> p;
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        int n,m,k;
        scanf("%d%d%d",&n,&m,&k);
        memset(deg,0,sizeof(deg));
        for(int i=0;i<=n;i++)a[i].clear();
        while(m--){
            int x,y;
            scanf("%d%d",&x,&y);
            a[x].push_back(y);
            deg[y]++;
        }
        priority_queue<int,vector<int>,greater<int> > que;
        for(int i=1;i<=n;i++){
            que.push(i);
        }
        ll ans=0,coun=1;
        memset(used,false,sizeof(used));
        while(!que.empty()){
            int temp=que.top();
            que.pop();
            if(kcontinue;

            if(used[temp])continue;k-=deg[temp];
            used[temp]=true;
            ans+=((temp*coun)%mod);ans%=mod;
            coun++;
            int tx=temp;
            int num=a[tx].size();
            for(int i=0;iif(!used[a[tx][i]])
                    que.push(a[tx][i]);
            }
        }
        printf("%lld\n",ans);
    }
    return 0;
}

你可能感兴趣的:(ACM_秘之贪心)