题目传送门

这道题目没有什么难的,是一道拓扑排序+递推的题目。我的思路是开始处理出拓扑序,然后因为数据范围很小怎么搞都可以,就邻接矩阵存图+暴力枚举。结果60分。

后来看题解发现,大家都是边拓扑边进行递推的,才发现自己这部分可能不对。另外的,就都是一些细节了==。

Code

 #include<cstdio>
#include<algorithm>
#include<queue> using namespace std; int n,m,tot,cnt;
int c[],head[],cdu[],rdu[],seq[];
struct node{
int to,val,next;
}edge[]; void add(int x,int y,int z)
{
edge[++tot].to=y;
edge[tot].next=head[x];
edge[tot].val=z;
head[x]=tot;
} void topo()
{
queue<int>q;
for(int i=;i<=n;i++)
if(rdu[i]==) q.push(i);
while(!q.empty())
{
int x=q.front();q.pop();
seq[++cnt]=x;
for(int i=head[x];i;i=edge[i].next)
{
int y=edge[i].to;
if(--rdu[y]==) q.push(y);
if(c[x]>) c[y]+=edge[i].val*c[x];
}
}
} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
int x=;
scanf("%d%d",&c[i],&x);
if(c[i]==) c[i]-=x;
}
for(int i=;i<=m;i++)
{
int x=,y=,z=;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);rdu[y]++;cdu[x]++;
}
topo();
bool flag=;
for(int i=;i<=n;i++)
if(cdu[i]==&&c[i]>) printf("%d %d\n",i,c[i]),flag=;
if(!flag) printf("NULL");
return ;
}

最新文章

  1. SQL 谜题(父亲的邮票)
  2. IE8兼容模式设置
  3. OpenNMS架构介绍
  4. URAL 1784 K - Rounders 找规律
  5. QString和char字符数组之间的转换(QTextCodec.toUnicode方法,特别注意\0的问题)
  6. ARM学习笔记8——通用寄存器和存储器内容交换指令和软中断指令
  7. EXCEL插件
  8. java线 生产者和消费者
  9. nodejs开发aspnet5项目
  10. LeetCode 167. Two Sum II - Input array is sorted (两数之和之二 - 输入的是有序数组)
  11. 如何去掉修改Joomla、joomlart及其模版版权、标志、图标的方法
  12. day09_request&amp;response学习笔记
  13. MTK(android init.rc) 写一个开机启动的服务
  14. Python-ccs高级选择器 盒模型
  15. html5-新布局元素header,footer
  16. gdb调试问题汇总
  17. L1-055 谁是赢家
  18. SRM480
  19. 20155320《网络对抗》MSF基础应用
  20. PAT 1001. A+B Format 解题

热门文章

  1. 如何给老婆解释什么是RESTful
  2. 使网页适应UIWebView的宽度
  3. 写入文本文件时“\n”不是回车换行而是个方块“■”的解决方法
  4. linux学习:进程间通信—管道
  5. sanic官方文档解析之Response和Cookie
  6. Java中的常用异常处理方法
  7. a column-oriented DBMS
  8. SWT 安装
  9. OpenSSL生成CA证书及终端用户证书
  10. hdu 2112 HDU Today 解题报告