传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=1046

试题描述:

WZJ又有一个问题想问问大家。WZJ用数据生成器生成了一个虚拟旅游区。这个旅游区由N个城市构成,标号从1到N,这些城市之间由M条双向道路连接。
其中每个城市有一个游乐场,游客可以花costi的钱数去城市i的游乐场玩,并获得happyi的高兴值,但对于一个游乐场,游客只能去玩至多一次。
因为虚拟旅游区的内存有限,有时候WZJ被迫在系统中删去一些边,当然WZJ可能忘记一些已被删去的边。
另外有些同学想来体验,WZJ会给他money的钱数,并把他送到城市x,他能通过未删除的道路去一些城市的游乐场玩。
下面请你帮助WZJ完成Q次操作,操作分两种:
1、0 y:虚拟旅游区的内存有限,WZJ被迫在系统中删去边y(不保证边y未被删去,这时你可以忽略这次指令)。
2、1 x money:又来了一个同学想来体验,WZJ给了他money的钱数,并把他送到城市x,问在最多花money的钱数能得到的最大高兴值。

输入:

输入第一行为三个正整数N,M,Q。
接下来N行每行为两个正整数costi,happyi。
再接下来M行每行为两个正整数ui,vi。
最后Q行每行为一个操作。

输出:

对于每个操作2,输出结果单占一行。

输入示例:

3 4 10
1 2
2 7 
1 4
1 2
2 3
1 3
1 1
1 1 2
1 1 1
0 1
1 1 1
1 1 2
0 2
1 1 2
0 2
0 3
1 1 3

输出示例:

7
4
4
7
6
2

其他说明:

1<=N<=10000, 1<=M,Q<=100000, 1<=ui,vi,x<=N, 1<=costi,money<=200, 1<=happyi<=100000,1<=y<=M

题解:时光倒流+背包dp

注意,加边的时候都搞成单向边了(,,• ₃ •,,)好神奇呀呀(。•ˇ‸ˇ•。)小健建就是NB呀呀呀(ㆀ˘・з・˘)

还有,结点要开2倍,我也不造为什么诺_( ゚Д゚)ノ

 #include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <queue>
#define REP(s, n) for(int i = s; i <= n; i ++)
#define RAP(s, n) for(int j = s; j <= n; j ++)
#define DE(i) e[POS(i)].del
#define POS(i) query[i].pos
#define V(i) query[i].v
#define ID(i) query[i].id
#define ANS(i) query[i].ans
#define COST(i) p[i].cost
#define HA(i) p[i].happy
using namespace std;
const int maxn = + ;
const int maxm = + ;
const int maxma = + ;
struct Point { int cost, happy; } p[maxn];
struct Edge {
int u, v, del;
Edge() { del = ; }
}e[maxm];
struct Tedge { int to, next; } adj[maxm];
struct Questions {
int pos, v, ans;
bool id;
Questions() { ans = ; }
}query[maxm];
int Q, n, m, dp[maxn][maxma], f[maxn], tar_num[maxn], fch[maxn];
int findset(int x){
return x == f[x] ? x : f[x] = findset(f[x]);
}
int ms = ;
void AddEdge(int from, int to){
adj[ms] = (Tedge) { to, fch[from] };
fch[from] = ms ++;
return ;
}
int que[maxn], tot;
void dfs(int x){
que[++ tot] = x;
for(int i = fch[x]; i; i = adj[i].next) dfs(adj[i].to);
return ;
}
void merge(int u, int v){
int f1 = findset(u), f2 = findset(v);
if(f1 == f2) return ;
if(tar_num[f1] > tar_num[f2]) swap(f1, f2);
tar_num[f2] += tar_num[f1]; tar_num[f1] = ; f[f1] = f2;
tot = ; dfs(f1); AddEdge(f2, f1);
REP(, tot){
int v = p[que[i]].cost, w = p[que[i]].happy;
for(int j = ; j >= v; j --) dp[f2][j] = max(dp[f2][j], dp[f2][j - v] + w);
}
return ;
}
void read(int &x){
x = ; int sig = ; char ch = getchar();
while(!isdigit(ch)) { if(ch == '-') sig = -; ch = getchar(); }
while(isdigit(ch)) x = * x + ch - '', ch = getchar();
x *= sig; return ;
}
void init(){
read(n), read(m), read(Q); int temp;
REP(, n) f[i] = i, tar_num[i] = ;
REP(, n){
read(COST(i)); read(HA(i));
RAP(COST(i), ) dp[i][j] = HA(i);
}
REP(, m) read(e[i].u), read(e[i].v);
REP(, Q){
read(temp); ID(i) = temp;
if(!ID(i)) {
read(POS(i));
if(!DE(i)) DE(i) = i;
}
else read(POS(i)), read(V(i));
}
return ;
}
void work(){
REP(, m) if(!e[i].del) merge(e[i].u, e[i].v);
for(int i = Q; i; i --){
if(!ID(i) && DE(i) == i) merge(e[POS(i)].u, e[POS(i)].v);
else ANS(i) = dp[findset(POS(i))][V(i)];
}
return ;
}
void print(){
REP(, Q) if(ID(i)) printf("%d\n", ANS(i));
return ;
}
int main(){
init();
work();
print();
return ;
}

COJ 3016 WZJ的图论问题的更多相关文章

  1. COJ 0346 WZJ的旅行(二)更新动态树分治版本

    WZJ的旅行(二) 难度级别:D: 运行时间限制:3000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 时隔多日,WZJ又来到了幻想国旅行.幻想国由N个城市组成,由 ...

  2. COJ 0967 WZJ的数据结构(负三十三)

    WZJ的数据结构(负三十三) 难度级别:E: 运行时间限制:7000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 请你设计一个数据结构,完成以下功能: 给定一个大 ...

  3. COJ 0970 WZJ的数据结构(负三十)树分治

    WZJ的数据结构(负三十) 难度级别:D: 运行时间限制:1000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给你一棵N个点的无根树,点和边上均有权值.请你设计 ...

  4. COJ 0349 WZJ的旅行(五)

    WZJ的旅行(五) 难度级别:E: 运行时间限制:3000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 WZJ又要去旅行了T^T=0.幻想国由N个城市组成,由于道 ...

  5. COJ 0990 WZJ的数据结构(负十)

    WZJ的数据结构(负十) 难度级别:D: 运行时间限制:5000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 给你一个N个节点的有根树,从1到N编号,根节点为1并给 ...

  6. COJ 1008 WZJ的数据结构(八) 树上操作

    传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=986 WZJ的数据结构(八) 难度级别:E: 运行时间限制:3000ms: ...

  7. COJ 1007 WZJ的数据结构(七) 树上操作

    传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=983 WZJ的数据结构(七) 难度级别:C: 运行时间限制:1000ms: ...

  8. COJ 0343 WZJ的公司(二)

    传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=313 试题描述: WZJ的公司放假了!为了保证假期期间公司的安全,WZJ决定 ...

  9. COJ 0985 WZJ的数据结构(负十五)(限定区域不同数)

    传送门:http://oj.cnuschool.org.cn/oj/home/addSolution.htm?problemID=955 试题描述: CHX有一个问题想问问大家.给你一个长度为N的数列 ...

随机推荐

  1. [Angular 2] Create a simple search Pipe

    This lesson shows you how to create a component and pass its properties as it updates into a Pipe to ...

  2. 物联网MQTT协议分析和开源Mosquitto部署验证

    在<物联网核心协议—消息推送技术演进>一文中已向读者介绍了多种消息推送技术的情况,包括HTTP单向通信.Ajax轮询.Websocket.MQTT.CoAP等,其中MQTT协议为IBM制定 ...

  3. [转] JAVA的Random类

    Random类 (java.util) Random类中实现的随机算法是伪随机,也就是有规则的随机.在进行随机时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要 ...

  4. iOS网络HTTP、TCP、UDP、Socket 知识总结

    OSI 七层模型 我们一般使用的网络数据传输由下而上共有七层,分别为物理层.数据链路层.网络层.传输层.会话层.表示层.应用层,也被依次称为 OSI 第一层.第二层.⋯⋯. 第七层. 如下图: 各层功 ...

  5. ASP.NET-FineUI开发实践-13(二)

    1.加图标和事件 上次已经通过DataSimulateTreeLevelField属性控制了树节点的显示,不用看也知道就是给指定列数据前面加个图标的HTML 可以在SimulateTreeHeper类 ...

  6. Ecstore后台中显示页面display,page,singlepage方法的区别?

    dispaly 显示的页面不包含框架的其他页面,只是本身的页面(使用范围:Ecstore的前端.后端). page 显示的页面包含在框架的里面(使用范围:Ecstore的前端.后端). singlep ...

  7. Linux下svn命令switch用法

    # svn info /data/www/49you/api.49you.com Path: /data/www/49you/api.49you.comURL: svn://192.168.10.81 ...

  8. 创建dblink遇到一系列问题

    创建dblink遇到一系列问题,有时间 把问题整理一下

  9. iOS开发中的常用宏定义

    在iOS开发的过程中合理的使用宏定义能够极大提高编码的速度,下面是一些常用的宏定义,部分内容来自互联网 Log // 调试状态, 打开LOG功能 #ifdef DEBUG #define GLLog( ...

  10. 关于C#编程中引用与值类型赋值的一些容易犯错的地方

    值类型与引用类型的区别在于:值类型在赋值的时候是拷贝值,引用类型在赋值的时候的拷贝引用.记住这一个原则,我们再来分析一些具体情况: PointStruct pt1 = ,); PointStruct ...