莫队+重点轻点

题意:给你n个点(每个点都有一个颜色,0代表黑色,1代表白色),m条边,每条边有一个权值.现在有有两个操作,一个是修改某个点的颜色(白变成黑/黑变成白),另外一个是询问那些边的两个端点都为指定颜色的权值总和

分析:将所有点分为重点和轻点,但是这次重点和重点之前的边要建在一个图中,剩余的边要建在另一个图中。对于最后访问的颜色,只有三种情况黑+黑(求和为0),黑+白(求和为1),白+白(求和为2),所以用a[0],a[1],a[2]分别对应的答案。对于重点i设置一个sum[i][2],sum[i][0]表示所有与他相邻且颜色为0(黑)的点的边权之和,sum[i][1]同理。更新时,对于重点i来说拿sum[i][0]和sum[i][1]去直接更新a数组,同时将其相邻的重点的sum值进行修改。而对于轻点i来说,遍历所有与i相连的边,暴力更新a数组,而当其相邻点为重点时则需要更新一下重点的sum数组。对于查询操作,直接输出a数组中的值即可

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<vector>
  6 #include<cmath>
  7 using namespace std;
  8 const int M=1e5+10;
  9 typedef long long ll;
 10 struct node{
 11     ll u,v,w;
 12 }a[M];
 13 bool cmp(node p,node q){
 14     if(p.u==q.u)
 15         return p.v<q.v;
 16     return p.u<q.u;
 17 }
 18 struct node1{
 19     ll id,w;
 20     node1(ll id1=0,ll w1=0):id(id1),w(w1){
 21     }
 22 };
 23 vector<node1>g1[M],g2[M];
 24 ll n,m,in[M],zhong[M],sum[M][3],ans[4],col[M];
 25 char s[10];
 26 int main(){
 27     ll sign=1;
 28     while(scanf("%lld%lld",&n,&m)!=EOF){
 29         for(int i=1;i<=n;i++){
 30             g1[i].clear();
 31             g2[i].clear();
 32             zhong[i]=0;
 33             in[i]=0;
 34             sum[i][0]=sum[i][1]=0;
 35         }
 36         memset(ans,0,sizeof(ans));
 37         //ans[0]=ans[1]=ans[2]=0;
 38         for(int i=1;i<=n;i++)
 39             scanf("%lld",&col[i]);
 40         for(int i=1;i<=m;i++){
 41             scanf("%lld%lld%lld",&a[i].u,&a[i].v,&a[i].w);
 42             if(a[i].u>a[i].v)
 43                 swap(a[i].u,a[i].v);
 44             ans[col[a[i].u]+col[a[i].v]]+=a[i].w;
 45         }
 46         sort(a+1,a+1+m,cmp);
 47         ll cnt=0;
 48         int i,j;
 49         //将重边加在一起;
 50         for(i=1;i<=m;i=j){
 51             for(j=i+1;j<=m;j++)
 52                 if(a[i].u==a[j].u&&a[i].v==a[j].v){
 53                     a[i].w+=a[j].w;
 54                 }
 55                 else
 56                     break;
 57             a[++cnt]=a[i];
 58         }
 59         ll N=(int)sqrt(cnt);
 60         for(i=1;i<=cnt;i++){
 61             in[a[i].u]++;
 62             in[a[i].v]++;
 63         }
 64         for(i=1;i<=n;i++){
 65             if(in[i]>N)
 66                 zhong[i]=1;
 67         }
 68         for(i=1;i<=cnt;i++){
 69             ll u=a[i].u,v=a[i].v,w=a[i].w;
 70             if(zhong[u]){
 71                 if(zhong[v]){
 72                     g1[u].push_back(node1(v,w));
 73                     g1[v].push_back(node1(u,w));
 74                     sum[u][col[v]]+=w;
 75                     sum[v][col[u]]+=w;
 76                 }
 77                 else{
 78                     g2[v].push_back(node1(u,w));
 79                     sum[u][col[v]]+=w;
 80                 }
 81             }
 82             else{
 83                 if(zhong[v]){
 84                     g2[u].push_back(node1(v,w));
 85                     sum[v][col[u]]+=w;
 86                 }
 87                 else{
 88                     g2[u].push_back(node1(v,w));
 89                     g2[v].push_back(node1(u,w));
 90                 }
 91             }
 92         }
 93         ll P;
 94         printf("Case %lld:\n",sign++);
 95         scanf("%lld",&P);
 96
 97
 98         while(P--){
 99             scanf("%s",s);
100             if(s[0]=='A'){
101                 int x,y;
102                 scanf("%d%d",&x,&y);
103                 printf("%lld\n",ans[x+y]);
104             }
105             else{
106                 int x;
107                 scanf("%d",&x);
108                 if(zhong[x]){
109                     ans[col[x]+0]-=sum[x][0];
110                     ans[col[x]+1]-=sum[x][1];
111                     ans[1-col[x]+0]+=sum[x][0];
112                     ans[1-col[x]+1]+=sum[x][1];
113                     for(i=0;i<g1[x].size();i++){
114                         ll v=g1[x][i].id,w=g1[x][i].w;
115                         sum[v][col[x]]-=w;
116                         sum[v][1-col[x]]+=w;
117
118                     }
119                 }
120                 else{
121                     for(i=0;i<g2[x].size();i++){
122                         ll v=g2[x][i].id,w=g2[x][i].w;
123                         ans[col[x]+col[v]]-=w;
124                         ans[1-col[x]+col[v]]+=w;
125                         if(zhong[v]){
126                             sum[v][col[x]]-=w;
127                             sum[v][1-col[x]]+=w;
128                         }
129                     }
130                 }
131                 col[x]=1-col[x];
132             }
133         }
134     }
135     return 0;
136 }

View Code

转载于:https://www.cnblogs.com/starve/p/10864724.html

hdu4467 graph相关推荐

  1. 图融合GCN(Graph Convolutional Networks)

    图融合GCN(Graph Convolutional Networks) 数据其实是图(graph),图在生活中无处不在,如社交网络,知识图谱,蛋白质结构等.本文介绍GNN(Graph Neural ...

  2. Graph Representation 图神经网络

    Graph Representation 图神经网络 图表示学习(representation learning)--图神经网络框架,主要涉及PyG.DGL.Euler.NeuGraph和AliGra ...

  3. TVM 图优化Graph Optimization

    TVM 图优化Graph Optimization Codegen

  4. ONNX 实时graph优化方法

    ONNX 实时graph优化方法 ONNX实时提供了各种图形优化来提高模型性能.图优化本质上是图级别的转换,从小型图简化和节点消除,到更复杂的节点融合和布局优化. 图形优化根据其复杂性和功能分为几个类 ...

  5. MIT Graph实践概述

    MIT Graph实践概述 Features功能 • iCloud Support • Multi Local & Cloud Graphs • Thread Safe • Store Any ...

  6. list python 转tensor_TensorFlow 中的几个关键概念:Tensor,Operation,Graph,Session

    前言:TensorFlow是一种符号式编程框架,首先要构造一个图(graph),然后在这个图上做运算.打个比方,graph就像一条生产线,session就像生产者.生产线具有一系列的加工步骤(加减乘除 ...

  7. Depth graph

    深度相机 定义:可以直接获取场景中物体距离摄像头物理距离的相机.在计算机视觉系统中,三维场景信息为图像分割.目标检测.物体跟踪等各类计算机视觉应用提供了更多的可能性,而深度图像(Depth map)作 ...

  8. model存数据_Jepsen 测试框架在图数据库 Nebula Graph 中的实践

    在本篇文章中主要介绍图数据库 Nebula Graph 在 Jepsen 这块的实践. Jepsen 简介 Jepsen 是一款用于系统测试的开源软件库,致力于提高分布式数据库.队列.共识系统等的安全 ...

  9. golang通过itemid获取zabbix graph监控图

    2019独角兽企业重金招聘Python工程师标准>>> #简述 本文将使用golang和第三方http client 库gorequest编写.如需要只使用golang 标准库可以参 ...

最新文章

  1. 99%的人都能看懂的分布式最佳「补偿」实践
  2. 练习1: Python基本语法元素 (第1周)
  3. boost::multiprecision模块random相关的测试程序
  4. halcon从入门到精通pdf_机器视觉软件开发新人入门必看 --机器视觉软件开发学习路径...
  5. MySQL 无符号和有符号的区别
  6. 作者:刘新海(1976-),男,中国人民银行征信中心副研究员
  7. mysql双主双从_mysql双主双从
  8. Android之RecyclerView实现时光轴
  9. 国外程序猿整理的C++大全
  10. java后台生成excel_Java后台生成Excel前台下载
  11. 网易云基于 Kubernetes 的深度定制化实践
  12. spring boot 中文文档_已献出膝盖!GitHub上的宝藏级SpringBoot核心文档,讲得太清晰了...
  13. Windows10中安装VMware Workstation Pro 15.x与使用Ubuntu 20.04 LTS
  14. 几种表面缺陷检测数据集
  15. 关于Aws SNS的使用 小结
  16. 备份自查-微博错误代码
  17. 【Asan】工欲善其事必先利其器——AddressSanitizer
  18. 微信小程序加签验签(wxapp_rsa,jsencrypt)和egg搭建的后端交互(jsrsasign,node_rsa)最全!!!
  19. QT项目-“kun容道”
  20. 《算法导论》学习笔记第一章

热门文章

  1. C#线程从陌生到熟悉(4)
  2. Oracle WebCenter 11g 快速开发指南--翻译(一)
  3. 如果我睡着了请不要叫醒我
  4. 怎么用python读取csv文件、并且是读取行-使用python获取csv文本的某行或某列数据的实例...
  5. python中return的理解-python中的return的返回与执行
  6. python可以干嘛用-Python可以被用来做哪些神奇好玩的事情
  7. 哪里可以接到python的活干-学了Python以后,我干了很多不是人干的活
  8. python写文件读文件-Python 实例:读写文件
  9. python数据分析的主要流程-用Python语言做数据分析基本思路和流程
  10. python画折线图详解-利用python画折线图