HDU2647

第一道逆拓扑纪念一下。。。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string.h>
#define maxint 999999999
#define MAXN 10005
#define ll long long
using namespace std;

int n,m,k,flag,num;
ll sum;
int Mark[MAXN],st[MAXN],vis[MAXN];
struct node{
     int x,y;
     int flag;
}cmp[20010];

void topsort(){
    int l=0;
    while(1){
        int j;
        int s=0;
        for(j=1;j<=n;j++){
            if(Mark[j]==0){
                sum+=num;
                --Mark[j];
                ++s;
                vis[s]=j;
                ++l;
            }
        }
        num++;
        if(l==n)
           break;
        if(!s){
            flag=1;
            break;
        }
        else{
            for(int i=1;i<=s;i++){
            for(int k=1;k<=m;k++){
                if(cmp[k].y==vis[i]&&Mark[cmp[k].x]!=0&&cmp[k].flag==0){
                    --Mark[cmp[k].x];
                    cmp[k].flag=1;
                }
            }
            }
        }
    }
}

int main()
{

    while(scanf("%d %d",&n,&m)!=EOF){
        sum=0;
        num=888;
        memset(vis,0,sizeof(vis));
        memset(Mark,0,sizeof(Mark));
        for(int i=1;i<=m;i++){
            scanf("%d %d",&cmp[i].x,&cmp[i].y);
                ++Mark[cmp[i].x];
                cmp[i].flag=0;
        }
        flag=0;
        topsort();
        if(flag)
            printf("-1\n");
        else
          printf("%lld\n",sum);
    }return 0;
}
时间: 2024-12-25 19:21:03

HDU2647的相关文章

HDU2647(拓扑排序+反向建图)

题意不说了,说下思路. 给出的关系是a要求的工资要比b的工资多,由于尽可能的让老板少付钱,那么a的工资就是b的工资+1,可以确定关系为a>b,根据拓扑排序建边的原则是把"小于"关系看成有向边,那么我们可以建边v->u. #include <stdio.h> #include <string.h> #include <string> #include <iostream> #include <algorithm> #

HDU2647 Reward 【拓扑排序】

Reward Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3927    Accepted Submission(s): 1199 Problem Description Dandelion's uncle is a boss of a factory. As the spring festival is coming , he w

hdu-2647 Reward &amp;&amp; hdu-2049产生冠军 &amp;&amp;hdu-3342Legal or Not(拓扑排序)

题目链接: hdu-2647 /*Problem : 2647 ( Reward ) Judge Status : Accepted RunId : 16919085 Language : G++ Author : 2014300227 Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta*/ #include <bits/stdc++.h> using namespace std; const int

hdu2647(拓扑排序)

链接:点击打开链接 题意:每一个人的基本工资为888,给出两个人的关系a,b,代表a的工资比b高问满足全部条件的话,最少须要支付多少钱 代码: #include <map> #include <queue> #include <stack> #include <string> #include <vector> #include <stdio.h> #include <stdlib.h> #include <stri

HDU2647 Reward(拓扑排序)反向建图

Reward Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4638    Accepted Submission(s): 1416 Problem Description Dandelion's uncle is a boss of a factory. As the spring festival is coming , he w

HDU2647 topsort

Problem Description Dandelion's uncle is a boss of a factory. As the spring festival is coming , he wants to  distribute rewards to his workers. Now he has a trouble about how to distribute the rewards.   The workers will compare their rewards ,and s

hdu2647(拓扑排序)

这道题题意很简单,老板给员工发福利,有些员工要求自己的福利必须比某个人高,老板希望在满足所有人的要求下,总花费最小. 拓扑排序分层,反向建表,正向也可以,只不过计算稍微麻烦些,但更接近题意. 这道题我还是卡了一会的,一开始用下标模拟堆栈的方法wa了好多次,后来试着调用stl的栈,接着wa,才发现是自己的分层策略和栈的性质不相容. 我的分层策略是,若有个点,在删去一个边之后入度变为0,则这个点的层数为刚刚删掉的那条边的起点的层数加1. 使用这种策略加上用栈会在处理一些特殊情况是发生错误.后来改为用

hdu2647 逆拓扑,链式前向星。

原文地址 题目分析 题意 老板发工资,但是要保证发的工资数满足每个人的期望,比如A期望工资大于B,只需比B多1元钱即可.老板发的最低工资为888元.输出老板最少发的工资总数,若是无法满足大家的期望,则输出-1. 分析 很明显这是一个拓扑问题,若存在环则无法满足大家的期望.若按常理,A>B,则可能会建立A指向B的有向边.此题不然,因为我们只知道最少的钱数是888,所以从小到大进行拓扑排序更为恰当.所以是建立B指向A的有向边.此之为逆拓扑排序.因为这样处理后排序的结果与原先拓扑排序的顺序相反. 以图

hdu2647 N!Again

N!Again Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4781    Accepted Submission(s): 2527 Problem Description WhereIsHeroFrom:             Zty, what are you doing ? Zty: