[POJ3417]Network

思路:
考虑加入新边对原图的影响:
  每加入一条边,相当于在原图中构成一个环,因此要使原图在这个环上断开,必须删去这条新边和环上任意一条树边。
统计每一条树边出现在多少个环中,计作$c$:
  1.$c=0$,则该边不属于任何一个环,因此删去这条边的同时删去任意一条新边即可,对答案的贡献是$m$;
  2.$c=1$,则该边仅属于一个环,因此删去这条边并删去该环上的新边即可,对答案的贡献是$1$;
  3.$c\geq 2$,则该边同时包含于多个环中,无论删去哪一个新边,总有别的环使原图连通,对答案的贡献是$0$。
因此我们可以统计$c$来得到答案。
我们可以利用树上差分的思想,对于每条新边$(u,v)$,$f_u=f_u+1$,$f_v=f_v+1$,$f_{LCA(u,v)}=f_{LCA(u,v)}+1$。
最后用树形DP求出每条边被环包含的次数。
Tarjan求LCA。
但是在OJ上测会TLE,必须要把vector改成前向星才可以。

 1 #include<cstdio>
 2 #include<cctype>
 3 inline int getint() {
 4     char ch;
 5     while(!isdigit(ch=getchar()));
 6     int x=ch^‘0‘;
 7     while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^‘0‘);
 8     return x;
 9 }
10 const int root=1,nil=0;
11 const int V=100001;
12 struct Edge {
13     int to,next;
14 };
15 int sz=0;
16 Edge edge[V<<2];
17 int e[V]={0},q[V]={0};
18 inline void add_edge(const int u,const int v) {
19     edge[++sz]=(Edge){v,e[u]};
20     e[u]=sz;
21 }
22 inline void add_query(const int u,const int v) {
23     edge[++sz]=(Edge){v,q[u]};
24     q[u]=sz;
25 }
26 class DisjointSet {
27     private:
28         int anc[V];
29     public:
30         DisjointSet() {
31             for(int i=0;i<V;i++) anc[i]=i;
32         }
33         int Find(const int x) {
34             return x==anc[x]?x:anc[x]=Find(anc[x]);
35         }
36         void Union(const int x,const int y) {
37             anc[Find(x)]=Find(y);
38         }
39 };
40 DisjointSet s;
41 bool vis[V]={0};
42 int f[V]={0};
43 void Tarjan(const int x,const int par) {
44     for(int i=e[x];i;i=edge[i].next) {
45         int &y=edge[i].to;
46         if(y!=par) Tarjan(y,x);
47     }
48     for(int i=q[x];i;i=edge[i].next) {
49         int &y=edge[i].to;
50         if(!vis[y]) continue;
51         int lca=s.Find(y);
52         f[x]++,f[y]++,f[lca]-=2;
53     }
54     s.Union(x,par);
55     vis[x]=true;
56 }
57 int cnt[2]={-1};
58 void DP(const int x,const int par) {
59     for(int i=e[x];i;i=edge[i].next) {
60         int &y=edge[i].to;
61         if(y==par) continue;
62         DP(y,x);
63         f[x]+=f[y];
64     }
65     if(f[x]<2) cnt[f[x]]++;
66 }
67 int main() {
68     int n=getint(),m=getint();
69     for(int i=1;i<n;i++) {
70         int u=getint(),v=getint();
71         add_edge(u,v);
72         add_edge(v,u);
73     }
74     for(int i=1;i<=m;i++) {
75         int u=getint(),v=getint();
76         add_query(u,v);
77         add_query(v,u);
78     }
79     Tarjan(root,nil);
80     DP(root,nil);
81     printf("%d\n",cnt[0]*m+cnt[1]);
82     return 0;
83 }
时间: 2024-11-05 17:32:29

[POJ3417]Network的相关文章

poj3417 Network 树上差分+LCA

题目传送门 题目大意:给出一棵树,再给出m条非树边,先割掉一条树边,再割掉一条非树边,问有几种割法,使图变成两部分. 思路:每一条 非树边会和一部分的树边形成一个环,分三种情况: 对于那些没有形成环的树边来说,割掉这条边,就已经使图分离,然后随便割一条非树边就可以了,所以这样的边每次答案加上m. 对于那些只存在在一个环中的树边来说,割掉这条边,再割一条和他存在于同一个环中的那条非树边,也能合法,所以加一. 对于存在于多个环中的树边,无论怎样,都无法合法. 也就是此时我们将题目转化成了树上的覆盖问

[poj3417]Network(LCA+树形dp)

题意:给出一棵无根树,然后下面再给出m条边,把这m条边连上,每次你去两条边,规定一条是树边,一条是新边,问有多少种方案能使树断裂. 解题关键:边权转化为点权,记录每条边被环覆盖的次数,通过val[a]++,val[b]++,val[lca(a,b)]-=2,来控制每个点上面的边,所以树的顶点要去掉. 好久没1A了,开心 1 //#pragma comment(linker, "/STACK:1024000000,1024000000") 2 #include<cstdio>

【POJ3417】Network

关于lca和树上差分的题目. 根据题目描述,主要边是一棵树,附加边会和主要边构成一个环,如果我们第一步切断了一条主要边,我们下一步就必须切断一条附加边才能符合题意. 所以,我们可以认为一条附加边(x,y)把树上x,y之间的路径覆盖了一遍,我们需要统计每条主要边被覆盖多少次即可.具体地,如果第一步我们切断被覆盖0次的边(这条边上没有附加边,切断一次就已经不连通了),那么我们第二次可以切断m条附加边的任意一条.如果我们切断覆盖一次的边,那么我们第二次的方法唯一确定.如果我们第一步切断被覆盖2次或以上

ubuntu开机出现waiting for network configuration

ubuntu启动时,出现waiting for network configuration,waiting up to 60 more seconds for network configuration等,进入桌面后网络图标也不见了 解决方法,首先在 /etc/network/interfaces 文件里面无关的都删去,留下lo这个 然后再到/etc/init/failsafe.conf文件里将sleep59改成5或10,sleep50意思是等待59秒

Linux 性能监控 : CPU 、Memory 、 IO 、Network

一.CPU 1.良好状态指标 CPU利用率:User Time <= 70%,System Time <= 35%,User Time + System Time <= 70% 上下文切换:与CPU利用率相关联,如果CPU利用率状态良好,大量的上下文切换也是可以接受的 可运行队列:每个处理器的可运行队列<=3个线程 2.监控工具 vmstat $ vmstat 1 procs -----------memory---------- ---swap-- -----io---- --s

深度学习方法(十):卷积神经网络结构变化——Maxout Networks,Network In Network,Global Average Pooling

技术交流QQ群:433250724,欢迎对算法.技术感兴趣的同学加入. 最近接下来几篇博文会回到神经网络结构的讨论上来,前面我在"深度学习方法(五):卷积神经网络CNN经典模型整理Lenet,Alexnet,Googlenet,VGG,Deep Residual Learning"一文中介绍了经典的CNN网络结构模型,这些可以说已经是家喻户晓的网络结构,在那一文结尾,我提到"是时候动一动卷积计算的形式了",原因是很多工作证明了,在基本的CNN卷积计算模式之外,很多简

qt.network.ssl: QSslSocket: cannot call unresolved function SSLv23_client_method

最近在做一个网络音乐播放器时,由于出现qt.network.ssl: QSslSocket: cannot call unresolved function SSLv23_client_method, 而不能播放网络歌曲. 上网搜了半天,都说要在电脑那里安装openssl,然后把C:\OpenSSL-Win64\bin下的libeay32.dll和ssleay32.dll拷贝到D:\Qt\Qt5.4.2\5.4\mingw491_32\bin, 然而并没什么卵用! 我的解决办法是: Qt的这个目

bzoj1834: [ZJOI2010]network 网络扩容

努力看了很久样例一直过不了...然后各种输出中间过程啊巴拉巴拉弄了1h,没办法了...然后突然想到啊原来的边可以用啊为什么不用...于是A了...感人肺腑 #include<cstdio> #include<cstring> #include<queue> #include<iostream> #include<algorithm> using namespace std; #define rep(i,n) for(int i=1;i<=n

linux 6.x network device not active

[[email protected] Desktop]# service networkrestart Shutting down interface eth0: Error: Device\'eth0\' (/org/freedesktop/NetworkManager/Devices/0)disconnecting failed: This device is not active [FAILED] Shutting down loopback interface: [ OK ] Bring