POJ_2553

这个题目本来是比较容易下手的,最后只需要求所有出度为0的强连通分量所包含的点,然后按字典序输出即可。但是由于一开始用邻接表写代码的时候由于读入边和存储边的写法问题导致我一直TLE,后来终于知道了怎么写才不会TLE,但是还是不太懂其中的原理,听群里人说是因为TLE的写法翻译成汇编语言会多出很多语句。

因此,以后写代码的时候,还是尽量少在数组名里面再嵌套数组名。

同时看了别人的代码还有一些额外的收获,就是在用邻接矩阵储存无权边时,用bool数组要比int的效率高,数据多时,即使在C里面用char数组都要比int数组的效率有明显的提高(大概20%,当然只是针对这个题目而言)。

#include<stdio.h>#include<string.h>int first[5010],next[25000010],v[5010];int num,output[5010];int s[5010],ins[5010],top,time,dfn[5010],low[5010],paint[5010];void tarjan(int a){int e,b,temp;    dfn[a]=low[a]=++time;    s[top++]=a;    ins[a]=1;for(e=first[a];e!=-1;e=next[e])    {        b=v[e];if(!dfn[b])        {            tarjan(b);if(low[b]<low[a])                low[a]=low[b];        }else if(ins[b]&&dfn[b]<low[a])            low[a]=dfn[b];    }if(dfn[a]==low[a])    {        s[top]=-1;while(s[top]!=a)        {            temp=s[--top];            ins[temp]=0;            paint[temp]=num;        }        num++;    }}int main(){int i,j,V,E,e,a,count;while(1)    {        scanf("%d",&V);if(V==0)break;        scanf("%d",&E);for(i=1;i<=V;i++)        {            first[i]=-1;            dfn[i]=0;            ins[i]=0;        }for(e=0;e<E;e++)        {            scanf("%d%d",&a,&v[e]);            next[e]=first[a];            first[a]=e;        }        top=time=num=0;for(a=1;a<=V;a++)if(!dfn[a])                tarjan(a);for(i=0;i<num;i++)            output[i]=1;for(i=1;i<=V;i++)for(j=first[i];j!=-1;j=next[j])if(paint[i]!=paint[v[j]])                    output[paint[i]]=0;for(j=1;;j++)if(output[paint[j]])            {                printf("%d",j);break;            }for(j+=1;j<=V;j++)if(output[paint[j]])                printf(" %d",j);        printf("\n");    }return 0;}

  

POJ 2553 The Bottom of a Graph相关推荐

  1. poj 2553 The Bottom of a Graph 未完

    题目大意:如果v点能够到的点,反过来能够到达v点,则称这个点为sink点,输出所有的sink点 RE #include <iostream>//https://blog.csdn.net/ ...

  2. The Bottom of a Graph Poj 2553

    牛客网 poj 2553 文章目录 Description 题意: 题解: 代码: Description We will use the following (standard) definitio ...

  3. 【POJ - 2553】The Bottom of a Graph(tarjan强连通分量缩点,模板题)

    题干: We will use the following (standard) definitions from graph theory. Let V be a nonempty and fini ...

  4. poj pku图论、网络流入门题总结、汇总

    poj pku图论.网络流入门题总结.汇总 分类: acm图论 2010-08-25 18:49 243人阅读 评论(0) 收藏 举报 网络算法networkgraphconstructioninte ...

  5. NOIP 好题推荐(DP+搜索+图论)POJ ZOJ

    NOIP好题推荐(DP+搜索+图论)POJ ZOJ 1370 Gossiping (数论->模线性方程有无解的判断)+(图论->DFS)  1090 Chain ->格雷码和二进制码 ...

  6. POJ 图论分类 + DP(较全 自己又加了点)

    DP -----------动态规划 状态压缩DP 2411 (棋盘规模较大)状态压缩DP+DFS+滚动数组 2664 (棋盘规模较小)直接递推即可(DP) 2506 (棋盘规模较小)直接递推即可(D ...

  7. 强联通分量算法的个人详解Tarjan算法(包含缩点)

    有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(strongly connected) ...

  8. python的turtle怎么画曲线_利用 turtle库绘制简单图形

    turtle库是python的基础绘图库,这个库被介绍为一个最常用的用来介绍编程知识的方法库,其主要是用于程序设计入门,是标准库之一,利用turtle可以制作很多复杂的绘图. turtle名称含义为& ...

  9. 【转载】图论 500题——主要为hdu/poj/zoj

    转自--http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

最新文章

  1. 深度学习在图像领域的几大任务
  2. 个人作业1:小学四则运算——基于控制台
  3. Spring学习笔记:3(面向切面AOP)
  4. 计算机大师高德纳权威著作《计算机程序设计艺术》影印版精装版已经入库,即将上市!
  5. jmeter性能测试入门简介
  6. spring el表达式 if else_vue指令集合:v-for,v-show,v-if等
  7. 让微信扫描直接下载你的APK
  8. java基本运算方法总结(ing)
  9. VoxelNet:End-to-End Learning for Point Cloud Based 3D Object Detection阅读笔记
  10. js 作为属性的变量
  11. macOS Big Sur初体验之自带五笔输入法质变
  12. 为什么程序员喜欢养猫?
  13. 使用 Onedrive 来同步Mac 桌面
  14. 常见的一些代码编辑器
  15. Hibernate开发之创建POJO-配置文件-映射文件
  16. 经典白话算法之桶排序
  17. 简单又好用的5款小工具软件
  18. Oracle undo 介绍
  19. Userspace RCU原理
  20. daemon函数详解

热门文章

  1. fanuc机器人码垛编程实例_两个很简单的FANUC系统CNC加工中心编程实例
  2. python 通过索引迭代列表_Python的索引迭代
  3. 为程序员节省时间的习惯
  4. HTML课程表应用,可在PC和Android运行
  5. 20190913:(leetcode习题)罗马数字转整数
  6. AndroidStuido连接不上手机的解决方法
  7. VB中用API实现文件拖放
  8. 在RedHat Enterprise Linux 上Oracle 9i的安装配置与调优
  9. Waymo无人卡车高调重返凤凰城,重点路测高速和主干道,但货运先机已失
  10. 干货!谷歌首席科学家发文阐述“半监督学习革命”,想走出瓶颈先试试这个...