codevs 4040 EZ系列之奖金

 时间限制: 1 s
 空间限制: 64000 KB
 题目等级 : 钻石 Diamond
题目描述 Description

由于无敌的WRN在2015年世界英俊帅气男总决选中胜出,EZ总经理Mr.Lin心情好,决定给每位员工发奖金。EZ决定以每个人本年在EZ的贡献为标准来计算他们得到奖金的多少。

于是Mr.Lin下令召开m方会谈。每位参加会谈的代表提出了自己的意见:“我认为学生a的奖金应该比b高!”Mr.Lin决定要找出一种奖金方案,满足各位代表的意见,且同时使得总奖金数最少。每位学生奖金最少为100元。

输入描述 Input Description

第一行两个整数n,m,表示学生总数和代表数;

以下m行,每行2个整数a,b,表示某个代表认为第a号学生奖金应该比第b号学生高。

输出描述 Output Description

若无法找到合法方案,则输出“-1”;否则输出一个数表示最少总奖金。

样例输入 Sample Input

2 1

1 2

样例输出 Sample Output

201

数据范围及提示 Data Size & Hint

80%的数据满足n<=1000,m<=2000;

100%的数据满足n<=10000,m<=20000。

 #include<iostream>
#define inf (1<<31)-1
using namespace std;
#include<cstdio>
typedef long long ll;
#include<cstring>
#define N 10010
#include<stack>
stack<int>sta;
struct Edge{
int v,last;
}edge[N<<];
ll ans=;
int indu[N],head[N],t=,u,tot=,v,n,m;
void add_edge(int u,int v)
{
++t;
edge[t].v=v;
edge[t].last=head[u];
head[u]=t;
}
int read()
{
int sum=,ff=;char s;
s=getchar();
while(s<''||s>'')
{
if(s=='-') ff=-;
s=getchar();
}
while(''<=s&&s<='')
{
sum=sum*+s-'';
s=getchar();
}
return sum*ff;
}
void input()
{
n=read();m=read();
for(int i=;i<=m;++i)
{
v=read();u=read();
add_edge(u,v);
indu[v]++;
}
}
bool toposort()
{
int mon=;
while(tot<n)
{
for(int i=;i<=n;++i)
{
if(!indu[i])
{
ans+=+mon;
sta.push(i);
indu[i]=inf;
tot++;
}
}
if(sta.empty()) return false;
while(!sta.empty())
{
int topt=sta.top();
sta.pop();
for(int l=head[topt];l;l=edge[l].last)
{
indu[edge[l].v]--;
}
}
mon++;
}
return true;
}
int main()
{
input();
if(toposort())
{
cout<<ans<<endl;
}
else printf("-1\n");
return ;
}

cojs 438. 烦人的幻灯片

★☆   输入文件:slides.in   输出文件:slides.out   简单对比
时间限制:1 s   内存限制:128 MB

【问题描述

李教授将于今天下午作一次非常重要的演讲。不幸的是他不是一个非常爱整洁的人,他把自己演讲要用的幻灯片随便堆在了一起。因此,演讲之前他不得不去整理这些幻灯片。做为一个讲求效率的学者,他希望尽可能简单地完成它。教授这次演讲一共要用n张幻灯片(n≤26),这n张幻灯片按照演讲要使用的顺序已经用数字l,2,…,n在上面编了号。因为幻灯片是透明的,所以我们不能一下子看清每一个数字所对应的幻灯片。
现在我们用大写字母A,B,C,…再次把幻灯片依次编号。你的任务是编写一个程序,把幻灯片的数字编号和字母编号对应起来,显然这种对应应该是惟一的;若是出现多种对应的情况或是某些数字编号和字母编号对应不起来,我们就称对应是无法实现的。

输入格式】
幻灯片的情况通过一个文本文件slides.in输入。
文件的第1行只有一个整数n,表示有n张幻灯片,接下来的n行每行包括4个整数Xmin,Xmax,Ymin,Ymax(整数之间用空格分开)为幻灯片的坐标,这n张幻灯片按其在输入文件中出现的顺序从前到后依次编号为A,B,C,…
再接下来的n行依次为n个数字编号的坐标x,y,显然在幻灯片之外是不会有数字的。
 
输出格式】
要求将程序的运行结果写入一个名为slides.out的文本文件。若是对应可以实现,输出文件应该包括n行,每一行为一个字母和一个数字,中间以一个空格隔开,并且各行以字母的升序排列,注意输出的字母要大写并且顶格;反之,若是对应无法实现,在文件的第1行顶格输出None即可。行首行末并无多余的空格。
输入输出样例】
输 入
4
6 22 10 20
4 18 6 16
8 20 2 18
10 24 4 8
9 15
19 17
11 7
21 11
输 出
A 4
B 1
C 2
D 3
这道题目类似于拓扑排序的思想:
 #define N 30
#include<vector>
#include<iostream>
using namespace std;
#include<cstdio>
#include<algorithm>
struct Edge{
int u;
vector<int>a;
bool operator <(const Edge&p)
const{return a.size()<p.a.size();}
}bh[N];
struct Kp{
int x1,x2,y1,y2;
}kp[N];
int flag[N],t=,tot=,n;
void input()
{
scanf("%d",&n);
for(int i=;i<=n;++i)
{
scanf("%d%d%d%d",&kp[i].x1,&kp[i].x2,&kp[i].y1,&kp[i].y2);
}
// memset(flag,0,sizeof(flag));
}
void add_edge(int u,int v)
{
bh[u].u=u;
bh[u].a.push_back(v);
}
void add()
{
int xi,xa,yi,ya;
for(int i=;i<=n;++i)
{
scanf("%d%d",&xi,&yi);
for(int j=;j<=n;++j)
{
if(xi>=kp[j].x1&&xi<=kp[j].x2&&yi>=kp[j].y1&&yi<=kp[j].y2)
{
add_edge(i,j);
}
}
}
}
int main()
{
freopen("slides.in","r",stdin);
freopen("slides.out","w",stdout);
input();
add();
sort(bh+,bh+n+);
for(int i=;i<=n;++i)
{
for(int j=;j<bh[i].a.size();++j)
{
if(flag[bh[i].a[j]]==)
{
int temp=bh[i].a[j];
flag[bh[i].a[j]]=bh[i].u;
tot++;
break;
}
}
}
int tbflag[N]={};
for(int i=;i<=n;++i)
{
for(int j=bh[i].a.size()-;j>=;--j)
{
if(tbflag[bh[i].a[j]]==)
{
int temp=bh[i].a[j];
tbflag[bh[i].a[j]]=bh[i].u;
break;
}
}
}
bool fla=true;
for(int i=;i<=n;++i)/*再反着做一次,是确保结果唯一的*/
{
if(tbflag[i]!=flag[i])
{
fla=false;break;
}
}
if(tot==n&&fla)
{
for(int i=;i<=n;++i)
{
printf("%c %d\n",i+'A'-,flag[i]);
}
}
else {
printf("None\n");
}
fclose(stdin);fclose(stdout);
return ;
}

拓扑排序 codevs 4040 cojs 438的更多相关文章

  1. NOIP 车站分级 (luogu 1983 & codevs 3294 & vijos 1851) - 拓扑排序 - bitset

    描述 一条单向的铁路线上,依次有编号为 1, 2, ..., n 的 n 个火车站.每个火车站都有一个级别,最低为 1 级.现有若干趟车次在这条线路上行驶,每一趟都满足如下要求:如果这趟车次停靠了火车 ...

  2. 【拓扑排序】CODEVS 2833 奇怪的梦境

    拓扑排序模板. #include<cstdio> #include<vector> #include<stack> using namespace std; #de ...

  3. Bzoj 1565: [NOI2009]植物大战僵尸 最大权闭合图,拓扑排序

    题目: http://cojs.tk/cogs/problem/problem.php?pid=410 410. [NOI2009] 植物大战僵尸 ★★★   输入文件:pvz.in   输出文件:p ...

  4. 算法与数据结构(七) AOV网的拓扑排序

    今天博客的内容依然与图有关,今天博客的主题是关于拓扑排序的.拓扑排序是基于AOV网的,关于AOV网的概念,我想引用下方这句话来介绍: AOV网:在现代化管理中,人们常用有向图来描述和分析一项工程的计划 ...

  5. 有向无环图的应用—AOV网 和 拓扑排序

    有向无环图:无环的有向图,简称 DAG (Directed Acycline Graph) 图. 一个有向图的生成树是一个有向树,一个非连通有向图的若干强连通分量生成若干有向树,这些有向数形成生成森林 ...

  6. 【BZOJ-2938】病毒 Trie图 + 拓扑排序

    2938: [Poi2000]病毒 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 609  Solved: 318[Submit][Status][Di ...

  7. BZOJ1565 [NOI2009]植物大战僵尸(拓扑排序 + 最大权闭合子图)

    题目 Source http://www.lydsy.com/JudgeOnline/problem.php?id=1565 Description Input Output 仅包含一个整数,表示可以 ...

  8. 图——拓扑排序(uva10305)

    John has n tasks to do. Unfortunately, the tasks are not independent and the execution of one task i ...

  9. Java排序算法——拓扑排序

    package graph; import java.util.LinkedList; import java.util.Queue; import thinkinjava.net.mindview. ...

随机推荐

  1. window10 mysql5.7 解压版 安装

    1. 解压mysql-5.7.11-winx64.zip 到某文件夹, 如C:\DevelopCommon\mysql-5.7.11-winx64. 2. 配置环境变量 变量名 : MYSQL_HOM ...

  2. Java synchronized关键字用法(清晰易懂)

    本篇随笔主要介绍 java 中 synchronized 关键字常用法,主要有以下四个方面: 1.实例方法同步 2.静态方法同步 3.实例方法中同步块 4.静态方法中同步块 我觉得在学习synchro ...

  3. Autofac全面解析系列(版本:3.5) – [使用篇(推荐篇):2.解析获取]

    前言 Autofac是一套高效的依赖注入框架. Autofac官方网站:http://autofac.org/ Autofac在Github上的开源项目:https://github.com/auto ...

  4. Afinal

    1.注解功能 1)继承:FinalActivity ( 需要复制 afinal_0.5.1_bin.jar到lib下) 2)@ViewInject() public class AfinalActiv ...

  5. log4j.xml 配置参数属性level使用心得

    jdbc.sqlonly        只显示执行的sql语句.info级才可以显示,debug增加显示java源代码位置. jdbc.sqltiming    显示执行的sql语句以及语句执行时间, ...

  6. 单例(Singleton pattern)模式的七种写法

    转载请注明出处:http://www.cnblogs.com/smbk/ One: public class Singleton { private static Singleton instance ...

  7. [Tool] 使用Astah绘制UML图形

    [Tool] 使用Astah绘制UML图形 前言 在软件开发的过程中,开发人员可以绘制UML图形来将分析设计内容转化为图形化文件,方便在团队之间传递分析设计结果.但在团队经费有限的情景中,可能没办法为 ...

  8. jQuery.merge()

    jQuery.merge( first, second ) //返回Array 合并两个数组内容到第一个数组. first第一个用来合并的数组,元素是第二数组加进来的. second第二个数组合并到第 ...

  9. Python基础(8)--文件

    文件是我们储存信息的地方,我们经常要对文件进行读.写.删除等的操作,在Python中,我们可用Python提供的函数和方法方便地操作文件.文件可以通过调用open或file来打开,open通常比fil ...

  10. JAVA EE(简述)

    一.平台概述 JavaEE的全称是Java Enterprise Edition,它是一个开发分布式企业级应用的规范和标准 Java 平台三个版本: Java ME(Java  Micro  Edit ...