intmain(){ int n = read(); rep(i,1,n+1) A[i] = read(); rep(i,1,n){ int u = read(); int v = read(); e[u].pb(v); e[v].pb(u); } maxSet<int> small ; // 前一半 minSet<int> large ; printf("%d\n",dfs(1,1,small,large,0)); return0; }
// 没有tuple structedge{ int u; int v; int w; // 结构体直接赋值也没有 edge(int _u,int _v,int _w){ u = _u; v = _v; w = _w; } };
vector<edge> e; // 有向边 [u,v,weight/length]
intmain(){ int N = read(); int ML = read(); int MD = read();
// 建图 rep(i,1,N) e.push_back(edge(i+1, i, 0)); // 从i+1->i权值为0的边 保证顺序i的距离不大于i+1 rep(i,0,ML){ //'喜欢'关系约束 <= DL int a = read(); int b = read(); // 保证 b>a int d = read(); // |距离| <= DL[i] /* b-a<=d, 即 a+d>=b 从a到b权值为d的边 */ e.push_back(edge(a,b,d)); } rep(i,0,MD){ //'不喜欢'关系约束 >= DD int a = read(); int b = read(); // 保证 b>a int d = read(); // |距离| >= DD[i] /* BD - AD >= DD 即 BD - DD >= AD, 从BD到AD权值-DD的边*/ e.push_back(edge(b,a,-d)); }
// Bellman_Ford vector<int>dist(N+1,INF);// 最短距离 dist[1] = 0; //循环N-1次 对所有边进行松弛操作 rep(t,0,N-1) rep(i,0,e.size()){ edge &uvw = e[i]; // 不支持auto int u = uvw.u; int v = uvw.v; int w = uvw.w; if(dist[u] != INF) dist[v] = min(dist[v], dist[u] + w); }
//再遍历一次所有边(第N次循环)如果本次有更新,则存在负环 bool ngloop = false; rep(i,0,e.size()){ edge &uvw = e[i]; // 不支持auto int u = uvw.u; int v = uvw.v; int w = uvw.w; if(dist[u] != INF && dist[u] + w < dist[v] ) ngloop = true; } int ans = dist[N]; if (ngloop) ans = -1; elseif(ans == INF) ans = -2; printf("%d\n", ans); return0; }
const ll INF = 0x3f3f3f3f; // > 1e9 constint N = 20; constint MASK = ( 1 << N ) ; constint M = N * 100000;
mint fac[M+10] = {1}; // 阶乘 mint ifac[M+10] ={1}; // 阶乘的逆向
int f[MASK+10]; // f[1 << i] = A[i], f[mask] = sum A int g[MASK+10]; // g[左侧mask] = sum B , 通过sosdp 变成子集和 mint h[MASK+10]; // h(S=bitmask) S中移除 X 个的方案数,(每个恰好一个) int cnt[MASK+10]; // mask 中1的个数 int cont[MASK+10]; // cont[mask] = 多少个父集合 是满足 最小代价为X的 在mask中移除让Hall定理触发不满足
int B[M+10]; // 读入 int adj[M+10]; // adj[右侧] = 左侧的bitmask
mint binom( int n, int m ){ return n < m ? 0 : fac[n] * ifac[m] * ifac[n - m]; }