HDU-2647拓扑排序
这道题不能用矩阵表示,因为1w*1w绝对超内存,分析数据,前一个a的钱要多于后一个b,所以我们要把b作为出度,a为入度,如果不明白这个地方,举例:b——>a——>c——>d ,b为888,钱数逐渐上升,如果反过来a为出度就不符合题意啦。。。
还有一个地方需要注意:判断输出-1的情况不能只判断没有一个入度为0的点,因为有可能在中间就出现矛盾了,如:a——>b——>c——>d——>c 有入度为0的点,但却要输出-1;
#include<iostream>
#include<cstring>
#include<queue>
#include<cstdio>
using namespace std;
#define MAX 10005
int n,sum,ans;
int into[MAX],head[MAX],money[MAX];
struct Reward
{
int to;
int next;
} edge[2*MAX];
void topu()
{
int i,j,l,v;
queue<int>Q;
for(i=1; i<=n; i++)
if(into[i]==0)
Q.push(i);//把入度为0的点压如队列
while(!Q.empty())
{
v=Q.front();//调用首位元素
sum+=money[v];
Q.pop();//出队
ans++; //用一个变量记录调用元素的总量,最后与n作比较
for(l=head[v]; l!=-1; l=edge[l].next)//与队首元素v有关的都枚举一遍
{
if(--into[edge[l].to]==0)//如果入度-1为0,即为v的下一个元素
{
Q.push(edge[l].to);//将其压入队列
money[edge[l].to]=money[v]+1;//保证后一个要比前一个多1
}
} }
}
int main()
{
int m,a,b,tot;
while(scanf("%d%d",&n,&m)!=EOF)
{ memset(head,-1,sizeof(head));
memset(into,0,sizeof(into));
for(int i=1; i<=n; i++)
money[i]=888;//所有人一开始都为888
tot=0;
sum=0;
ans=0;
while(m--)
{
scanf("%d%d",&a,&b);//注意要逆过来,因为后一个b是基础的888,应当作为出度
edge[tot].to=a;
edge[tot].next=head[b];
head[b]=tot++;
into[a]++;//记录入度
}
topu();
if(ans!=n)//有可能在中间出现矛盾,必须保证每个地方都不矛盾
sum=-1;
cout<<sum<<endl; } }
HDU-2647拓扑排序的更多相关文章
- hdu 2647 (拓扑排序 邻接表建图的模板) Reward
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=2647 老板给员工发工资,每个人的基本工资都是888,然后还有奖金,然后员工之间有矛盾,有的员工希望比某员 ...
- 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 4857 拓扑排序 优先队列
n个数,已经有大小关系,现给m个约束,规定a在b之前,剩下的数要尽可能往前移.输出序列 大小关系显然使用拓扑结构,关键在于n个数本身就有大小关系,那么考虑反向建图,优先选择值最大的入度为零的点,这样得 ...
- HDU 1811 拓扑排序 并查集
有n个成绩,给出m个分数间的相对大小关系,问是否合法,矛盾,不完全,其中即矛盾即不完全输出矛盾的. 相对大小的关系可以看成是一个指向的条件,如此一来很容易想到拓扑模型进行拓扑排序,每次检查当前入度为0 ...
- HDU 5638 拓扑排序+优先队列
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5638 题意: 给你一个DAG图,删除k条边,使得能个得到字典序尽可能小的拓扑排序 题解: 把拓扑排序 ...
- 传递 hdu 5961 拓扑排序有无环~
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5961 题目为中文,这里就不描述题意了. 思路: 从题目陈述来看,他将一个有向图用一个邻接矩阵来表示,并且分 ...
- hdu 4324 拓扑排序
题意:给出一堆人的喜爱关系,判断有没有三角恋-_-|| 其实就是判断是否存在三条边的环. 一开始我是这么想的: 先拓扑排序,如果没有环那就直接No 如果有环?挑出环里的任意一个点(拓扑排序结束后不在拓 ...
- HDU 4324 (拓扑排序) Triangle LOVE
因为题目说了,两个人之间总有一个人喜欢另一个人,而且不会有两个人互相喜欢.所以只要所给的图中有一个环,那么一定存在一个三元环. 所以用拓扑排序判断一下图中是否有环就行了. #include <c ...
随机推荐
- boost.asio包装类st_asio_wrapper开发教程(2014.5.23更新)(一)-----转
一:什么是st_asio_wrapper它是一个c/s网络编程框架,基于对boost.asio的包装(最低在boost-1.49.0上调试过),目的是快速的构建一个c/s系统: 二:st_asio_w ...
- windows消息处理(强烈推荐,收藏)
由于看了一下,比较好理解,暂时先放到这里,待有空再翻译.只是在每节后大致介绍一下讲的内容. 感觉写的比较全,无论从消息的原理还是从MFC操作上来说,值得一看,我也在此做个收藏. (一) 说明:以下首先 ...
- 【Demo 0006】Java基础-类多态性
本章学习要点: 1. 了解Java多态特性; 2. 掌握Java多态的实现: 一.多态特性 1. 定义: 指同一个对象调用相同的方法实现 ...
- bestcoder.hdu.edu.cn
http://bestcoder.hdu.edu.cn/ Problem A 题目链接: http://bestcoder.hdu.edu.cn/contests/contest_showproble ...
- 解决sqlserver2008 r2 登陆时报错:provider 命名管道提供程序, error40 错误2
错误截图: 这种错误是因为无法启动sqlserver服务,进入命令行,输入 services.msc 进入服务管理,找到sqlserver服务如下图. 在这里启动该服务会报错如下图: 此服务无法启 ...
- C++内存管理学习笔记(5)
/****************************************************************/ /* 学习是合作和分享式的! /* Auth ...
- Oracle PL/SQL 非预定义异常、自定义异常处理、RAISE_APPLICATION_ERROR
抛出异常 Oracle有三种类型的异常错误: 1. 预定义(Predefined)异常 ORACLE预定义的异常情况大约有24个.对这种异常情况的处理,无需在程序中定义,由ORACLE自动将其引发. ...
- go iota
package main import ( "fmt" ) const ( a = 'A' b c = iota d ) func main() { fmt.Println(a) ...
- swt,jface,rcp
//swt-jface-rcp,基本结构:display类,shell类,组件:widget窗口控件,control控件,composites面板,button,label,text文本框,list列 ...
- 它们的定义Adapterg在etView( )正在使用View.setTag()与不同的是不使用。
首先看使用Tag案件. @Override public View getView(int position, View view, ViewGroup group) { ViewHolder hol ...