hdu4467 Graph
Graph
Problem Description
Given a graph with n nodes and m undirected weighted edges, every node having one of two colors, namely black (denoted as 0) and white (denoted as 1), you’re to maintain q operations of either kind:
* Change x: Change the color of x
th node. A black node should be changed into white one and vice versa.
* Asksum A B: Find the sum of weight of those edges whose two end points are in color A and B respectively. A and B can be either 0 or 1.
P. T. Tigris doesn’t know how to solve this problem, so he turns to you for help.
For each test case, the first line contains two integers, n and m (1 ≤ n,m ≤ 10
5), where n is the number of nodes and m is the number of edges.
The second line consists of n integers, the i
th of which represents the color of the i
th node: 0 for black and 1 for white.
The following m lines represent edges. Each line has three integer u, v and w, indicating there is an edge of weight w (1 ≤ w ≤ 2
31 - 1) between u and v (u != v).
The next line contains only one integer q (1 ≤ q ≤ 10
5), the number of operations.
Each of the following q lines describes an operation mentioned before.
Input is terminated by EOF.
The first line contains “Case X:”, where X is the test case number (starting from 1).
And then, for each “Asksum” query, output one line containing the desired answer.
0 0 0 0
1 2 1
2 3 2
3 4 3
4
Asksum 0 0
Change 2
Asksum 0 0
Asksum 0 1
4 3
0 1 0 0
1 2 1
2 3 2
3 4 3
4
Asksum 0 0
Change 3
Asksum 0 0
Asksum 0 1
6
3
3
Case 2:
3
0
4
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;
#define MAXN 100005
struct nodeedge{
int s,e;
__int64 val;
}edge[40*MAXN];
struct nodelist{
int next,to,flag;
}l[200*MAXN];
char str[300];
int head[MAXN],p[MAXN],index[MAXN],limit;//判定是否是超极点
__int64 sum[3],sumsuper[MAXN][2];
void change(int x)
{
int i,j;
int temp=p[x]^1,t; for(j=head[x];j!=-1;j=l[j].next)
{
i=l[j].to;
sum[p[x]+p[i]]-=edge[j].val;
sum[temp+p[i]]+=edge[j].val;
if((!l[x].flag)&&l[i].flag)
{
sumsuper[i][p[x]]-=edge[j].val;
sumsuper[i][temp]+=edge[j].val;
}
}
if(l[x].flag)
{
sum[p[x]]-=sumsuper[x][0];
sum[temp]+=sumsuper[x][0];
sum[p[x]+1]-=sumsuper[x][1];
sum[temp+1]+=sumsuper[x][1];
}
p[x]=p[x]^1;//取反
}
void build(int i,int s,int e,__int64 val)//建邻接表
{
if(l[s].flag&&(!l[e].flag))
{
sumsuper[s][p[e]]+=val;
}
else
{
l[i].next=head[s];
l[i].to=e;
head[s]=i;
}
}
bool cmp(nodeedge a,nodeedge b)
{
if(a.s != b.s)
return a.s < b.s;
else
return a.e < b.e;
}
int main ()
{
int n,m,i,edgem,m2,asnum,a1,a2,tcase;
tcase=1;
while(scanf("%d%d",&n,&m)!=EOF)
{
limit=350;m2=2*m;
sum[0]=sum[1]=sum[2]=0;
for(i=1;i<=n;i++)
{
scanf("%d",&p[i]);
index[i]=0;head[i]=-1;
}
for(i=1;i<=m;i++)
{
scanf("%d%d%I64d",&edge[i].s,&edge[i].e,&edge[i].val);
edge[i+m].s=edge[i].e,edge[i+m].e=edge[i].s,edge[i+m].val=edge[i].val;//建反向边
sum[p[edge[i].s]+p[edge[i].e]]+=edge[i].val;
}
sort(edge+1,edge+m2+1,cmp);//边从1开始计数
edgem=1;
for(i=2;i<=m2;i++)//去掉重边
{
if((edge[i].s==edge[edgem].s)&&(edge[i].e==edge[edgem].e))
{
edge[edgem].val+=edge[i].val;
}
else{
edgem++;
edge[edgem]=edge[i];
}
}
for(i=1;i<=edgem;i++)
{
index[edge[i].s]++;
}
for(i=1;i<=n;i++)//统计超极结点
{
if(index[i]>=limit)
{
l[i].flag=1;//是超极结点
sumsuper[i][0]=sumsuper[i][1]=0;
} else
l[i].flag=0;
} for(i=1;i<=edgem;i++)//建领接表
{
build(i,edge[i].s,edge[i].e,edge[i].val);
}
scanf("%d",&asnum);
printf("Case %d:\n",tcase++);
while(asnum--)
{
scanf("%s",str);
if(str[0]=='A')
{
scanf("%d%d",&a1,&a2);
printf("%I64d\n",sum[a1+a2]);
}
else{
scanf("%d",&a1);
change(a1);
}
} }
return 0;
}
hdu4467 Graph的更多相关文章
- HDU4467:Graph(点的度数分块)
传送门 题意 给出一张n个点m条边的无向图,点的颜色为0/1,每次有两种操作: 1.Asksum x y,查询两点颜色为x和y的边的权值之和 2.Change x,将x颜色取反 分析 最直接的做法是每 ...
- HDU4467 Graph【轻重点维护】
HDU4467 Graph 题意: 给出一张染色图,\(n\)个点每个点是黑色或者白色,\(m\)条带权边,\(q\)次操作,有两种操作: 改变一个点的颜色 问所有边中两个端点的颜色为给定情况的边权和 ...
- [开发笔记] Graph Databases on developing
TimeWall is a graph databases github It be used to apply mathematic model and social network with gr ...
- Introduction to graph theory 图论/脑网络基础
Source: Connected Brain Figure above: Bullmore E, Sporns O. Complex brain networks: graph theoretica ...
- POJ 2125 Destroying the Graph 二分图最小点权覆盖
Destroying The Graph Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 8198 Accepted: 2 ...
- [LeetCode] Number of Connected Components in an Undirected Graph 无向图中的连通区域的个数
Given n nodes labeled from 0 to n - 1 and a list of undirected edges (each edge is a pair of nodes), ...
- [LeetCode] Graph Valid Tree 图验证树
Given n nodes labeled from 0 to n - 1 and a list of undirected edges (each edge is a pair of nodes), ...
- [LeetCode] Clone Graph 无向图的复制
Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors. OJ's ...
- 讲座:Influence maximization on big social graph
Influence maximization on big social graph Fanju PPT链接: social influence booming of online social ne ...
随机推荐
- RESTful 个人理解总结【转】
转自:http://www.cnblogs.com/wang-yaz/p/9237981.html 一.什么是RESTful 面向资源 简单的说:RESTful是一种架构的规范与约束.原则,符合这种规 ...
- 底板芯片组与内存映射(Motherboard Chipsets and the Memory Map) 【转】
转自:http://blog.chinaunix.net/uid-25909619-id-4194650.html 底板芯片组与内存映射 我打算写一些关于计算机内部构造(computer intern ...
- SPListItem.UpdateOverwriteVersion()真的不会创建新版本吗?
根据msdn文档, SPListItem.UpdateOverwriteVersion(): Updates the item without creating another version of ...
- 数据库SQL语句性能优化
选择最有效率的表名顺序 ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下 ...
- 使用 Application Loader提交IPA文件到苹果市场
打包.导出ipa包后剩下的就是要将ipa包推到appstore.Application Loader是苹果提供的ipa包提交工具. 1.启动Application Loader 打开xcode,在xc ...
- js中的事件委托或是事件代理详解(转载)
起因: 1.这是前端面试的经典题型,要去找工作的小伙伴看看还是有帮助的: 2.其实我一直都没弄明白,写这个一是为了备忘,二是给其他的知其然不知其所以然的小伙伴们以参考: 概述: 那什么叫事件委托呢?它 ...
- LeetCode(22):括号生成
Medium! 题目描述: 给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合. 例如,给出 n = 3,生成结果为: [ "((()))", ...
- Kubernetes Master节点灾备恢复操作指南---升级版
本文档简述了Kubernetes主节点灾备恢复的相关步骤,供在发生k8s master崩溃时操作. 就算是在k8s里部署了etcd群集, 主节点控制组件的高可用节点,灾备恢复也是必须要实现的操作,才能 ...
- 【PAT】1051 Pop Sequence (25)(25 分)
Given a stack which can keep M numbers at most. Push N numbers in the order of 1, 2, 3, ..., N and p ...
- linux nohup screen注解
一.nohup & 二.screen