先上题目:

321. The Spy Network

Time limit per test: 0.5 second(s)
Memory limit: 65536 kilobytes
input: standard
output: standard

The network of spies consists of N intelligence officers. They are numbered with the code numbers from 1 to N so that nobody could discover them. The number 1 belongs to the radiowoman Kat. There is exactly N - 1 communication channels between the spies. It is known that a message from any spy to Kat can reach her. All channels are unidirectional.

A channel can have one of two types: protected and almost protected. It is known that a message will not be intercepted almost surely by the hostile security service if at least half of the channels along the path to radiowoman Kat are protected. What is the minimum number of channels to be made protected from almost protected, so that any message from any spy will not be intercepted almost surely ? What are those channels?

Input

The first line of the input contains the integer number N (1 ≤ N ≤ 200000). The following N - 1 lines contain the description of the communication channels. Each channel is described by a pair of the code numbers of spies (the direction of the channel is from the first spy to the second one) and the parameter pi. If pi =

protected

, the channel is protected and if pi =

almost protected

, the channel is almost protected.

Output

Write the number of channels to be converted to protected to the first line of the output. To the next line write numbers of channels to be made protected. If there are several solutions, choose any of them.

Example(s)
sample input
sample output
5
5 1 almost protected
3 1 almost protected
2 3 protected
4 3 almost protected
2
1 2

    题意:给你一棵树,树的边是有向的,每条边有一个状态0或者1,现在告诉你根是1,问你最少需要改变多少多少条边的状态才能使每个点到达跟的路径上有一半以上的边是1,并且输出数目和这些边的编号。

    做法:先从根节点dfs一次,对于记录下每个节点还需要多少个1以及这个节点以及它的子树中的节点最多需要1的节点需要1的数目。然后在从根节点再dfs一次,这次的目的是对于当前状态为0的边我们可以考虑是否将它转化为1,因为对于这种转化来说,转移深度小的边对树的影响比转移深度大的边对树的影响更大,所以我们如果一棵子树里面的节点还需要1的话,就转换深度小的边。也就是说这样做符合贪心的思想。

上代码:

 #include <cstdio>
#include <cstring>
#include <algorithm>
#define MAX 200002
using namespace std; typedef struct {
int id,u,v,w,next;
} Edge; Edge e[MAX];
char ch[];
int p[MAX],need[MAX],am[MAX];
int tot,top; inline void add(int id,int u,int v,int w) {
e[tot].id=id;
e[tot].u=u;
e[tot].v=v;
e[tot].w=w;
e[tot].next=p[u];
p[u]=tot++;
} void dfs1(int r,int dep,int a) {
am[r]=(dep+)/ - a;
for(int i=p[r]; i!=-; i=e[i].next) {
dfs1(e[i].v,dep+,a+e[i].w);
am[r]=max(am[e[i].v],am[r]);
}
} void dfs2(int r,int num) {
for(int i=p[r]; i!=-; i=e[i].next) {
if(num<am[e[i].v]) {
if(e[i].w==) {
need[top++]=e[i].id;
dfs2(e[i].v,num+);
} else dfs2(e[i].v,num);
}
}
} int main() {
int n,u,v;
//freopen("data.txt","r",stdin);
while(~scanf("%d",&n)) {
memset(p,-,sizeof(p));
tot=top=;
for(int i=; i<n; i++) {
scanf("%d %d %s",&v,&u,ch);
if(ch[]=='a') {
scanf("%s",ch);
add(i,u,v,);
} else {
add(i,u,v,);
}
}
dfs1(,,);
dfs2(,);
printf("%d\n",top);
for(int i=; i<top; i++) {
if(i) printf(" ");
printf("%d",need[i]);
}
printf("\n");
}
return ;
}

/*321*/

SGU - 321 - The Spy Network的更多相关文章

  1. sgu 321 The Spy Network (dfs+贪心)

    321. The Spy Network Time limit per test: 0.5 second(s)Memory limit: 65536 kilobytes input: standard ...

  2. SGU 321 知道了双端队列,

    思路: 贪心. 每次删除最上面的边.. #include<utility> #include<iostream> #include<vector> #include ...

  3. 【转】Tarjan&LCA题集

    转自:http://blog.csdn.net/shahdza/article/details/7779356 [HDU][强连通]:1269 迷宫城堡 判断是否是一个强连通★2767Proving ...

  4. Tarjan & LCA 套题题目题解

    刷题之前来几套LCA的末班 对于题目 HDU 2586 How far away 2份在线模板第一份倍增,倍增还是比较好理解的 #include <map> #include <se ...

  5. SGU 149. Computer Network( 树形dp )

    题目大意:给N个点,求每个点的与其他点距离最大值 很经典的树形dp...很久前就想写来着...看了陈老师的code才会的...mx[x][0], mx[x][1]分别表示x点子树里最长的2个距离, d ...

  6. SGU 149 Computer Network 树DP/求每个节点最远端长度

    一个比较经典的题型,两次DFS求树上每个点的最远端距离. 参考这里:http://hi.baidu.com/oi_pkqs90/item/914e951c41e7d0ccbf904252 dp[i][ ...

  7. SGU 149. Computer Network

    时间限制:0.25s 空间限制:4M: 题意: 给出一颗n(n<=10000)个节点的树,和n-1条边的长度.求出这棵树每个节点到最远节点的距离: Solution: 对于一个节点,我们可以用D ...

  8. SGU 149 树形DP Computer Network

    这道题搜了一晚上的题解,外加自己想了半个早上,终于想得很透彻了.于是打算好好写一写这题题解,而且这种做法比网上大多数题解要简单而且代码也比较简洁. 首先要把题读懂,把输入读懂,这实际上是一颗有向树.第 ...

  9. COMP 321

    COMP 321April 24, 2019Questions on this exam may refer to the textbook as well as to the manual page ...

随机推荐

  1. redis简介及常见问题

    目录 简介 特点 优点 高性能 高并发 为什么要用 redis 而不用 map/guava 做缓存? redis 和 memcached 的区别 Redis快的原因 为什么redis是单线程 为什么r ...

  2. 二分图最大匹配(匈牙利算法) POJ 3020 Antenna Placement

    题目传送门 /* 题意:*的点占据后能顺带占据四个方向的一个*,问最少要占据多少个 匈牙利算法:按坐标奇偶性把*分为两个集合,那么除了匹配的其中一方是顺带占据外,其他都要占据 */ #include ...

  3. DFS HDU 5305 Friends

    题目传送门 /* 题意:每个点都要有偶数条边,且边染色成相同的两部分,问能有多少种染色方法 DFS+剪枝:按照边数来DFS,每种染色数为该点入度的一半,还有如果点不是偶数边就不DFS 这是别人的DFS ...

  4. E - Easy Dijkstra Problem(求最短路)

    Description Determine the shortest path between the specified vertices in the graph given in the inp ...

  5. Windows8.1进入IIS管理器的方法

    以前在本机的Windows8.1操作系统中安装了IIS,很久没有使用过,今天在安装IBM Http Server的时候启动失败,才想起来IIS占用了80端口,需要把IIS服务停止掉.找了半天才找到进入 ...

  6. Spring.Net学习笔记(6)-方法注入

    一.开发环境 系统:win10 编译器:VS2013 二.涉及程序集 Spring.Core.dll 1.3.1 Common.Logging.dll 三.开发过程 1.项目结构 2.编写Mobile ...

  7. android调用webservice接口获取信息

    我的有一篇博客上讲了如何基于CXF搭建webservice,service层的接口会被部署到tomcat上,这一篇我就讲一下如何在安卓中调用这些接口传递参数. 1.在lib中放入ksoap2的jar包 ...

  8. margin与padding如何进行区分

    margin与padding如何进行区分,这是很多学html人的困扰,其实说白了padding 就是内容与边框的空隙.而margin则是模块与模块的空隙.[3]

  9. VMware 12虚拟机下Ubuntu 16连不上网解决方法

    打开自带Firefox浏览器,显示连接不上网,终端下 ping 也显示 unkown   解决方法: 1.打开虚拟机的“编辑”选项,选择“虚拟网络编辑器” 2.选择VMnet8(我不知道为啥VMnet ...

  10. #NOIP前数学知识总结

    我好菜啊…… 欧拉函数 欧拉函数φ(n),是小于n且和n互质的正整数(包括1)的个数. 性质: 1.对于质数n: φ(n)=n-1 2..对于n=pk φ(n)=(p-1)*pk-1 3.积性函数的性 ...