hdu 2647 (拓扑排序 邻接表建图的模板) Reward
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=2647
老板给员工发工资,每个人的基本工资都是888,然后还有奖金,然后员工之间有矛盾,有的员工希望比某员工的奖金多,老板满足了所以员工的这种心思,而且老板下午发的总工资最少,问最少是多少?比如 a b 表示a的工资比b要高(高一块钱),当出现a b b c c a这种环的时候输出-1
拓扑排序http://www.cnblogs.com/tonghao/p/4721072.html
小指向大
邻接表建图
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std; const int M = 1e4 + ;
int head[M],into[M],n,m,cas,money[M];
struct Edge{
int to; //表示一条边上的大的结点(因为小指向大)编号
int next; //表示边的编号
}edge[M*];//注意为两倍 void init()
{
for (int i= ; i<=n ; i++){
head[i]=-;
into[i]=;
money[i]=;
}
} void addedge(int u(小),int v(大))//小指向大
{
edge[cas].to=v; //表示第cas条边的小的结点为v
edge[cas].next=head[u]; //表示上一条以u为起点的边的编号,就是假设一个点有多个出度
head[u]=cas++; //表示结点u所在的边的编号
into[v]++; //入度
} int topu()
{
queue<int>que;
int num=,sum=;
for (int i= ; i<=n ; i++)
if (into[i]==)
que.push(i);
while (!que.empty()){
int u=que.front();
sum+=money[u];
que.pop();
num++;
for (int i=head[u] ; i!=- ; i=edge[i].next){
into[edge[i].to]--;
if (into[edge[i].to]==){
que.push(edge[i].to);
money[edge[i].to]=money[u]+;
}
}
}
if (num!=n) return -;
return sum;
} int main()
{
while (~scanf("%d%d",&n,&m)){
init();
cas=;
while (m--){
int a,b;
scanf("%d%d",&a,&b);
addedge(b,a);
}
printf("%d\n",topu());
}
return ;
}
vector建图的表示,其实差不多
#include<queue>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std; const int M = 1e4 + ;
int a[M],into[M],money[M],n,m;
vector<int>q[M]; int topu()
{
memset(into,,sizeof(into));
for (int i= ; i<=n ; i++)
for (int j= ; j<q[i].size() ; j++)
into[q[i][j]]++;
queue<int>que;
int cnt=,sum=;
for (int i= ; i<=n ; i++)
if (into[i]==)
que.push(i);
while (!que.empty()){
int u=que.front();
que.pop();
cnt++;
sum+=money[u];
for (int i= ; i<q[u].size() ; i++){
int v=q[u][i];
into[v]--;
if (into[v]==) {
que.push(v);
money[v]=money[u]+;
}
}
}
if (cnt!=n) return -;
return sum;
} int main()
{
while (~scanf("%d%d",&n,&m)){
for (int i= ; i<=n ; i++) {
q[i].clear();
money[i]=; }
while (m--){
int a,b;
scanf("%d%d",&a,&b);
q[b].push_back(a);
}
printf("%d\n",topu());
}
return ;
}
hdu 2647 (拓扑排序 邻接表建图的模板) Reward的更多相关文章
- HDU 2647 拓扑排序
题意:每个人的工资至少888,然后有m个条件,前者比后者要多.求最少工资. 分析: 最开始的开邻接矩阵的肯定超时,如果dfs,会出现由于刚开始不是从入度为0的点出发,后期修改不了.比较麻烦. 正确方式 ...
- hdu 2647拓扑排序 容器
#include<stdio.h> #include<queue> #include<vector> #include<iostream> using ...
- hdu 2647拓扑排序 结构体模拟容器
#include<stdio.h> #include<queue> #include<iostream> using namespace std; #define ...
- hdu 4324 拓扑排序
题意:给出一堆人的喜爱关系,判断有没有三角恋-_-|| 其实就是判断是否存在三条边的环. 一开始我是这么想的: 先拓扑排序,如果没有环那就直接No 如果有环?挑出环里的任意一个点(拓扑排序结束后不在拓 ...
- HDU 4857 拓扑排序 优先队列
n个数,已经有大小关系,现给m个约束,规定a在b之前,剩下的数要尽可能往前移.输出序列 大小关系显然使用拓扑结构,关键在于n个数本身就有大小关系,那么考虑反向建图,优先选择值最大的入度为零的点,这样得 ...
- PTA 邻接表存储图的广度优先遍历(20 分)
6-2 邻接表存储图的广度优先遍历(20 分) 试实现邻接表存储图的广度优先遍历. 函数接口定义: void BFS ( LGraph Graph, Vertex S, void (*Visit)(V ...
- HDU 1811 拓扑排序 并查集
有n个成绩,给出m个分数间的相对大小关系,问是否合法,矛盾,不完全,其中即矛盾即不完全输出矛盾的. 相对大小的关系可以看成是一个指向的条件,如此一来很容易想到拓扑模型进行拓扑排序,每次检查当前入度为0 ...
- 【bzoj1565】[NOI2009]植物大战僵尸 拓扑排序+最大权闭合图
原文地址:http://www.cnblogs.com/GXZlegend/p/6808268.html 题目描述 输入 输出 仅包含一个整数,表示可以获得的最大能源收入.注意,你也可以选择不进行任何 ...
- QDUOJ 生化危机 邻接表存图+BFS
生化危机 发布时间: 2015年10月10日 18:05 时间限制: 1000ms 内存限制: 256M 描述 X博士想造福人类, 研发一种可以再生肢体的药物, 可是很不幸......研究失败 ...
随机推荐
- winform,listbox设置行高
//必须要在写这个事件里写才有效果 private void listBox1_MeasureItem(object sender, MeasureItemEventArgs e) { e.ItemH ...
- Android源码50例汇总,欢迎各位下载(转载)
下载中心好资料很多,藏在各个角落,小弟在此帮大家做了一个整理,做了一个下载目录,方便大家选择性下载. 源码实例如下: <Android应用开发揭秘>源代码推荐 http://down.51 ...
- 生成一个文件夹中的所有文件的txt列表
1.windows操作系统中 1.用管理员运行打开dos界面: 2.用cd转到相应的文件夹中: 3.用dir /b /on >list.txt来生成文件列表的txt. 2.Mac系统中 1.打开 ...
- SAP 000 客户端初始登录
Solution 在SAP系统DB中删除账号SAP*,SAP系统会自动创建SAP*这个账号,然后初始密码是“PASS”,这样就获得Client 000 SAP*账号. Step by Step 以Or ...
- JDK8中JVM堆内存划分
一:JVM中内存 JVM中内存通常划分为两个部分,分别为堆内存与栈内存,栈内存主要用运行线程方法 存放本地暂时变量与线程中方法运行时候须要的引用对象地址. JVM全部的对象信息都 存放在堆内存中.相比 ...
- JDBC事物的处理
JDBC事物的处理: 概念:事务是指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功. 数据库开启事务命令: start transaction 开启事务 Rollback ...
- Vi命令:如何删除全部内容
Vi命令:如何删除全部内容? 在命令模式下,输入:.,$d 一回车就全没了. 表示从当前行到末行全部删除掉. 用gg表示移动到首行.
- pandas的日常笔记--查询
- ubuntu后台运行命令
参考 https://blog.csdn.net/shaozg168/article/details/6979337 nohup ./test.sh &
- overflow属性的用法
<style type="text/css">div{ background-color:#00FFFF; width:150px; height:150px; ove ...