首页 > 其他分享 >图论练习题

图论练习题

时间:2024-08-12 20:39:59浏览次数:9  
标签:练习题 状态 图论 idx int head edge 1015

[NOIP2003]神经网络
1.题意看懂以后就是计算一下每一个入度0的点最终的状态,并且如果这个状态>0就输出出来,对于阈值,我们可以在一开始就对这些入度的0的点直接减去阈值。
2.然后就是一个拓扑排序的模型,因为我们要计算一个点的状态是需要这个点前面相连的所有点的状态而来,因此很容易想到拓扑排序。其次需要掌握链式前向星的存储方式,方便理解代码。
3.注意处理一些代码的细节,比如计算状态的时候,只有状态>0的点可以传递信号

#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,p;

int din[1015],dout[1015];//入度和出度
int c[1015],u[1015];//各自的状态,阈值
vector<int>tp;//存放点的拓扑序
//---------链式前向星存图------
struct Edge{
    int to;
    int w;
    int next;
}edge[1015];
int head[1015],idx;

void add(int u,int v,int w)
{
    edge[idx].w=w;
    edge[idx].to=v;
    edge[idx].next=head[u];
    head[u]=idx++;
}
//----------------------------



void toposort()
{
   queue<int>q;
   for(int i=1;i<=n;i++) if(din[i]==0) q.push(i);
   while(q.size())
   {
       auto x=q.front();q.pop();
       tp.push_back(x);
       for(int i=head[x];i!=-1;i=edge[i].next)//链式前向星的遍历
       {
           if(--din[edge[i].to]==0) q.push(edge[i].to);
       }
       
   }
}



signed main()
{
 
   cin>>n>>p;
   for(int i=1;i<=n;i++)
   {
       cin>>c[i]>>u[i];
       if(!c[i]) c[i]-=u[i];
       //输出层可以直接减去这个阈值
   }
   
   
   //别忘记对head数组初始化
   memset(head,-1,sizeof head);
   
   
   while(p--)
   {
       int u,v,w;
       cin>>u>>v>>w;
        add(u,v,w);
       din[v]++;//别忘记入度和出度
       dout[u]++;
  
   }
   
   //对这些点进行拓扑排序
   toposort();
   
  
   //排完序后计算每点的状态
   for(int i=0;i<tp.size();i++)
   {
       int j=tp[i];
       if(c[j]>0){//只有大于0的状态才可以向其他神经元传递信号
       for(int k=head[j];k!=-1;k=edge[k].next)
       {
           c[edge[k].to]+=edge[k].w*c[j];
       }
       }
   }
   
 
   int fla=1;//检查神经元状态是否都为0
   for(int i=1;i<=n;i++)
   {
       //出度为0的点才是输出层,并且状态要大于0
       if(c[i]>0 and !dout[i]) cout<<i<<" "<<c[i]<<endl,fla=0;
   }
   if(fla) cout<<"NULL";
  
    
    
}

标签:练习题,状态,图论,idx,int,head,edge,1015
From: https://www.cnblogs.com/swjswjswj/p/18355697

相关文章

  • DP练习题(二)
    [NOIP2008普及组]传球游戏上体育课的时候,小蛮的老师经常带着同学们一起做游戏。这次,老师带着同学们一起做传球游戏。游戏规则是这样的:......
  • 【学习笔记】Matlab和python双语言的学习(图论最短路径)
    文章目录前言一、图论基本概念示例二、代码实现----Matlab三、代码实现----python总结前言通过模型算法,熟练对Matlab和python的应用。学习视频链接:https://www.bilibili.com/video/BV1EK41187QF?p=36&vd_source=67471d3a1b4f517b7a7964093e62f7e6一、图论图论(G......
  • 图论基础实现
    图的存储使用邻接表来存储#include<bits/stdc++.h>usingnamespacestd;structedge{intu,v;};vector<edge>e;intn,m;//n个点,m条边//如何证明一条边存在呢?直接枚举即可boolfind_edge(intu,intv){for(inti=1;i<=m;i++)if(e[i].u==u&&e[i].v==v)r......
  • 算法小总结-图论
    拓扑排序[HNOI2015]菜肴制作////Createdbyfxzon2024/8/3.//#include<bits/stdc++.h>usingnamespacestd;intans[1008611];#defineintlonglongboolTopSort(vector<vector<int>>&G,intn,vector<int>&inDegree){......
  • 代码随想录算法训练营第64天 | 图论:Floyd 算法+A * 算法
    97.小明逛公园https://kamacoder.com/problempage.php?pid=1155Floyd算法精讲https://www.programmercarl.com/kamacoder/0097.小明逛公园.html#floyd-算法精讲Floyd算法精讲问题总结:双向道路;路径规划;多个起点到多个终点核心思想:动态规划确定dp数组和下标含义:grid......
  • Studying-代码随想录训练营day62| Floyd 算法精讲、A*算法精讲(A star算法)、最短路算法
    第62天,完结撒花*★,°*:.☆( ̄▽ ̄)/$:*.°★*,最后的两个算法学习,编程语言C++目录Floyd算法精讲A*算法精讲(Astar算法) A*算法 复杂度分析 A*算法的缺点最短路算法总结篇 图论总结深搜和广搜并查集最小生成树 拓扑排序 最短路算法 总结 Floyd算法精讲......
  • JavaSE基础知识分享(三)相关练习题
    写在前面大家前面的面向对象部分学的怎么样了,快来看看这些题你能不能快速地写出答案,面向对象在Java中是非常重要的,快来检测你的薄弱点在哪,及时查漏补缺!使用面向对象思想编写下列题目:1.使用面向对象的思想,编写自定义描述狗的信息。设定属性包括:品种,年龄,心情,名字;方法包括:叫,跑。......
  • 代码随想录算法训练营第61天 | 图论part08:拓扑排序+迪杰斯特拉朴素法
    117.软件构建https://kamacoder.com/problempage.php?pid=1191拓扑排序精讲https://www.programmercarl.com/kamacoder/0117.软件构建.html#拓扑排序的背景47.参加科学大会https://kamacoder.com/problempage.php?pid=1047dijkstra(朴素版)精讲https://www.programmercarl.c......
  • 17:Python数据类型练习题
    #1获取c1,c2相同的元素列表c1=[11,22,33]c2=[22,33,44]foriinc1:ifiinc2:print(i)#2获取c1中有,c2没有的元素列表foriinc1:ifinotinc2:print(i)#3获取c2中有,c1没有的元素列表foriinc2:ifinotinc1:print(i)#4获......
  • Java基础编程练习题50题(没更新完会持续更新)
    1.古典问题有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?publicclassRabbit{publicstaticvoidmain(String[]args){intmonths=12;//假设计算12个月的情......