@OceanEye7年前
05/27
21:13
点双联通分量乱搞
一遍DFS可以处理出一个点周围的连通分量 [tarjan]
还可以处理出他们的和
尝试用树形DP的思想来思考的话会很简单
但是玩点歌姬细节打错于是调了很久quq
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
#include <cstdio> #include <algorithm> #include <cstring> #include <cstdlib> #include <cmath> #define ll long long #define INF 1000000000 #define p(x) ('0'<=x&&x<='9') #define For(i,l,r) for(int i=l;i<=r;i++) char cc; int C; template <class T> void read( T &x ) { x=0; cc=getchar(); C=1; while(!p(cc)) { if(cc=='-') C=-1; cc=getchar(); } while(p(cc)) { x=x*10+cc-48; cc=getchar(); } x*=C; } using namespace std; #define N 100010 struct node { int fa,dfn,mn,siz; bool vis; }pool[N]; #define FA pool[x].fa #define DFN pool[x].dfn #define MN pool[x].mn #define SIZ pool[x].siz #define VIS pool[x].vis struct Tedge { int from,to; bool use; Tedge(int _=0,int __=0) { from=_; to=__; use=0; } }edge[1000010]; int TOP; #define E edge[i] #define TO E.to #define FROM E.from #define USE E.use int e_tot,NXT[1000010],fst[N]; void add_e(const int &a,const int &b) { edge[e_tot]=Tedge(a,b); NXT[e_tot]=fst[a]; fst[a]=e_tot++; edge[e_tot]=Tedge(b,a); NXT[e_tot]=fst[b]; fst[b]=e_tot++; } void cp(int &x,int y) { x>y?x=y:x=x; } ll ans[N]; int cd,n,m; void tarjan(int x) { DFN=MN=++cd; VIS=true; SIZ++; int pcnt=0; for(int i=fst[x];~i;i=NXT[i]) { if(USE||TO==FA) continue; USE=true; i^=1; USE=true; i^=1; if(!pool[TO].vis) { pool[TO].fa=x; tarjan(TO); cp(MN,pool[TO].mn); if(pool[TO].mn>=DFN) { ans[x]+=(ll)pcnt*pool[TO].siz; pcnt+=pool[TO].siz; } SIZ+=pool[TO].siz; } else cp(MN,pool[TO].dfn); } ans[x]+=(ll)(n-pcnt-1)*pcnt; } int main() { freopen("BZOJ1123.in","r",stdin); int __,_; memset(fst,-1,sizeof(fst)); read(n); read(m); while(m--) { read(_); read(__); add_e(_,__); } tarjan(1); for(int i=1;i<=n;i++) printf("%lld\n",(ans[i]+(n-1))*2); return 0; } |