可以直接见这个博客:http://blog.csdn.net/black_miracle/article/details/52164974

  对其中的几点作一些解释:

  1.这个方法我们对队列中取出的元素,把仍有出度的点连接到这个点时,这个点是不会连接到多余的点的,因为:一个点出队列的时候其他没入队的点都已经连接到这个点过了,后来再一个点出队列的时候,我们拿此时没入队的点连接到它时,肯定已经连接过之前的点了,所以肯定不会增加到达的点数。(可能我也用语言讲不太清楚233。。。)

  2.为什么这个人的博客说最终如果num不是0的话就表示成环了?理由如下:不妨考虑四个点的情况:3,3,3,0。最后一个点操作后,出度变为2,2,2,0。这个时候队列已经空了,然而num还不是0,说明还有点没有完成达到它所需要达到的点数(也可以这么解释:num的个数表示还没有完成点数个数任务的点的个数,num=0才表示所有的点都已经完成到达点数个数的目标了,不是0当然不能够满足题意了)。至于为什么是成环的话,因为它们不能够完成点数个数任务,所以他们必须连向别人构成环来构成目标了呗~

  反正这个拓扑排序有点奥义,需要好好理解~

  代码如下:

 #include <stdio.h>
#include <algorithm>
#include <string.h>
#include <vector>
#include <set>
#include <queue>
using namespace std;
const int N = + ; struct edge
{
int u,v;
bool operator < (const edge &temp) const
{
return u == temp.u ? v<temp.v : u<temp.u;
}
};
int a[N],inq[N],n;
set<edge> S; void solve()
{
queue<int> Q;
int cnt = n;
for(int i=;i<=n;i++)
{
if(!a[i])
{
Q.push(i);
inq[i] = ;
cnt--;
}
}
while(!Q.empty())
{
int x = Q.front();Q.pop();
for(int i=;i<=n;i++)
{
if(!inq[i])
{
a[i]--;
S.insert((edge){i,x});
if(!a[i])
{
Q.push(i);
inq[i] = ;
cnt--;
}
}
}
}
if(cnt) puts("No");
else
{
puts("Yes");
printf("%d\n",S.size());
for(set<edge>::iterator it=S.begin();it!=S.end();it++)
{
edge e = *it;
printf("%d %d\n",e.u,e.v);
}
}
} int main()
{
int T;scanf("%d",&T);
for(int kase=;kase<=T;kase++)
{
scanf("%d",&n);
S.clear();memset(inq,,sizeof(inq));
for(int i=;i<=n;i++) scanf("%d",a+i);
printf("Case #%d: ",kase);
solve();
}
return ;
}

HDU 5813 Elegant Construction ——(拓扑排序,构造)的更多相关文章

  1. HDU 5813 Elegant Construction(优雅建造)

    HDU 5813 Elegant Construction(优雅建造) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65 ...

  2. HDU 5813 Elegant Construction 构造

    Elegant Construction 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5813 Description Being an ACMer ...

  3. HDU 5813 Elegant Construction (贪心)

    Elegant Construction 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5813 Description Being an ACMer ...

  4. HDU 5813 Elegant Construction

    构造.从a[i]最小的开始放置,例如放置了a[p],那么还未放置的,还需要建边的那个点 需求量-1,然后把边连起来. #pragma comment(linker, "/STACK:1024 ...

  5. 题解报告:hdu 2647 Reward(拓扑排序)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2647 Problem Description Dandelion's uncle is a boss ...

  6. hdu 5098 双队列拓扑排序

    http://acm.hdu.edu.cn/showproblem.php?pid=5098 软件在安装之后需要重启才能发挥作用,现在给你一堆软件(有的需要重启有的不需要)以及安装这个软件之前需要哪些 ...

  7. HDU 5811 Colosseo(拓扑排序+单调DP)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5811 [题目大意] 给出 一张单向图,现在将其划分成了两个部分,问划分之后的点是否分别满足按照一定 ...

  8. 洛谷P1073 Tarjan + 拓扑排序 // 构造分层图

    https://www.luogu.org/problemnew/show/P1073 C国有 n n个大城市和 mm 条道路,每条道路连接这 nn个城市中的某两个城市.任意两个城市之间最多只有一条道 ...

  9. HDU 2647 Reward(拓扑排序+判断环+分层)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2647 题目大意:要给n个人发工资,告诉你m个关系,给出m行每行a b,表示b的工资小于a的工资,最低工 ...

随机推荐

  1. CSS——font使用方法

    <style> p{ /*font-style: italic;/*设置字体为斜体*/ font-variant: small-caps; font-weight: bolder;/*设置 ...

  2. asp.net 12 AJAX

    Javascript:ajax Ajax:get <%@ Page Language="C#" AutoEventWireup="true" CodeBe ...

  3. dev chart使用

    public class LineChartHelp { #region 折线图 /// <summary> /// 创建折线图 /// </summary> public v ...

  4. 谁是嫌疑犯问题Python枚举法

    原文:https://blog.csdn.net/yunzifengqing/article/details/81941592 问题描述:有6名犯罪嫌疑人A.B.C.D.E.F,已知如下事实: A.B ...

  5. Typora入门:全网最全教程

    目录 简介 Markdown介绍 常用快捷键 块元素 换行符 标题级别 引用文字 无序列表 有序列表 任务列表 代码块 数学表达式 插入表格 脚注 分割线 目录(TOC) 跨度元素 链接 网址 图片 ...

  6. Java8 常用Function、Predicate、Consumer、Supplier接口

    1.常用函数是接口: (1)Function<T, R> => R apply(T t) ———— 接受一个T类型的参数,返回R类型结果. Function<Integer, ...

  7. vim insert VISUAL模式无法右键复制问题(转)

    转自:https://blog.csdn.net/coder_oyang/article/details/89096219 vim中使用鼠标右键粘贴,失败.vim的模式: 网上解法: 1. 普通模式下 ...

  8. golang编写二叉树

    最近开始找golang 开发工程师职位,针对算法相关二叉树相关常用面试题搞一遍: package tree import (     "math"     "fmt&qu ...

  9. Go 工作空间 深度解析

    介绍 这篇文档举例证明了一个简单地 Go package 并且介绍了 go tool,标准的方法来 fetch, build,and install Go package and commands. ...

  10. java9 新特征

    Java 平台级模块系统 java模块化解决的问题:减少Java应用和Java核心运行时环境的大小与复杂性 模块化的 JAR 文件都包含一个额外的模块描述器.在这个模块描述器中, 对其它模块的依赖是通 ...