拓扑排序 codevs 4040 cojs 438
codevs 4040 EZ系列之奖金
由于无敌的WRN在2015年世界英俊帅气男总决选中胜出,EZ总经理Mr.Lin心情好,决定给每位员工发奖金。EZ决定以每个人本年在EZ的贡献为标准来计算他们得到奖金的多少。
于是Mr.Lin下令召开m方会谈。每位参加会谈的代表提出了自己的意见:“我认为学生a的奖金应该比b高!”Mr.Lin决定要找出一种奖金方案,满足各位代表的意见,且同时使得总奖金数最少。每位学生奖金最少为100元。
第一行两个整数n,m,表示学生总数和代表数;
以下m行,每行2个整数a,b,表示某个代表认为第a号学生奖金应该比第b号学生高。
若无法找到合法方案,则输出“-1”;否则输出一个数表示最少总奖金。
2 1
1 2
201
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,…再次把幻灯片依次编号。你的任务是编写一个程序,把幻灯片的数字编号和字母编号对应起来,显然这种对应应该是惟一的;若是出现多种对应的情况或是某些数字编号和字母编号对应不起来,我们就称对应是无法实现的。
再接下来的n行依次为n个数字编号的坐标x,y,显然在幻灯片之外是不会有数字的。
输 入
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的更多相关文章
- NOIP 车站分级 (luogu 1983 & codevs 3294 & vijos 1851) - 拓扑排序 - bitset
描述 一条单向的铁路线上,依次有编号为 1, 2, ..., n 的 n 个火车站.每个火车站都有一个级别,最低为 1 级.现有若干趟车次在这条线路上行驶,每一趟都满足如下要求:如果这趟车次停靠了火车 ...
- 【拓扑排序】CODEVS 2833 奇怪的梦境
拓扑排序模板. #include<cstdio> #include<vector> #include<stack> using namespace std; #de ...
- Bzoj 1565: [NOI2009]植物大战僵尸 最大权闭合图,拓扑排序
题目: http://cojs.tk/cogs/problem/problem.php?pid=410 410. [NOI2009] 植物大战僵尸 ★★★ 输入文件:pvz.in 输出文件:p ...
- 算法与数据结构(七) AOV网的拓扑排序
今天博客的内容依然与图有关,今天博客的主题是关于拓扑排序的.拓扑排序是基于AOV网的,关于AOV网的概念,我想引用下方这句话来介绍: AOV网:在现代化管理中,人们常用有向图来描述和分析一项工程的计划 ...
- 有向无环图的应用—AOV网 和 拓扑排序
有向无环图:无环的有向图,简称 DAG (Directed Acycline Graph) 图. 一个有向图的生成树是一个有向树,一个非连通有向图的若干强连通分量生成若干有向树,这些有向数形成生成森林 ...
- 【BZOJ-2938】病毒 Trie图 + 拓扑排序
2938: [Poi2000]病毒 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 609 Solved: 318[Submit][Status][Di ...
- BZOJ1565 [NOI2009]植物大战僵尸(拓扑排序 + 最大权闭合子图)
题目 Source http://www.lydsy.com/JudgeOnline/problem.php?id=1565 Description Input Output 仅包含一个整数,表示可以 ...
- 图——拓扑排序(uva10305)
John has n tasks to do. Unfortunately, the tasks are not independent and the execution of one task i ...
- Java排序算法——拓扑排序
package graph; import java.util.LinkedList; import java.util.Queue; import thinkinjava.net.mindview. ...
随机推荐
- UGUI之Toggle使用
Toggle对象是一个开关.一般用于单选,可以用Toggle制作背包的选项卡 在场景中创建Toggle按钮.看看他有Toggle组件
- Servlet-Jsp
Jsp实际就是Servlet. 我们访问Http://localhost:8080/Web/index.jsp的流程: 1 [jsp文件名].jsp转义为[jsp文件名_jsp].java,文件存储在 ...
- 【译】Dependency Injection with Autofac
先说下为什么翻译这篇文章,既定的方向是架构,然后为了学习架构就去学习一些架构模式.设计思想. 突然有一天发现依赖注入这种技能.为了使得架构可测试.易维护.可扩展,需要架构设计为松耦合类型,简单的说也就 ...
- CSS中的三种基本的定位机制
CSS 定位机制 CSS 有三种基本的定位机制:普通流.浮动和绝对定位. 一.普通流 除非专门指定,否则所有框都在普通流中定位.普通流中元素框的位置由元素在(X)HTML中的位置决定.块级元素从上到下 ...
- 调试CRM JS开发
CRM 2013 的表单是一个IFrame,如果使用jquey来控制表单的话调试起来比较麻烦,如果直接使用浏览器(firefox)来开发和验证脚本可能会事半功倍. 首页列表页主窗体:var table ...
- [C/C++] VS 2015 C++ 插件
Visual Studio2015 Community一些必备插件 ReSharper C++ 各种语言版本的代码重构,代码风格,代码修正功能,非常强大,可惜不是免费的,不过好在可以破解呢. Vias ...
- Arcengine实现创建网络数据集札记(二)
四 ArcEngine实现创建网络数据集 ArcEngine创建网络数据集的过程,与ArcMap设置的过程类似,主要通过六个步骤即可以实现. 1 定义网络数据集对象,并设置基本属性,包括网络数据集名称 ...
- 上传Android代码到Jcenter(解决了字符映射的问题)
请先阅读:http://blog.saymagic.cn/2015/02/16/release-library-to-jcenter.html 最外面的build.gradle // Top-leve ...
- IOS内存警告处理
IPhone下每个app可用的内存是被限制的,如果一个app使用的内存超过20M,则系统会向该app发送Memory Warning消息.收到此消息后,app必须正确处理,否则可能出错或者出现内存泄露 ...
- jvm运行时环境属性一览
前言: 在web编程技术内幕中看到一个用apache组件进行文件下载的例子,对于DiskFileUpload类的setRepositoryPath方法,设置临时文件的存放路径,里面指出如果不调用该方法 ...