【学习笔记】最大权闭合子图和最大密度子图(最小割的模型应用)

最大权闭合子图和最大密度子图

  • 最大权闭合子图
    • content
    • exercise
  • 最大密度子图
    • content
    • exercise
  • Upd:最大权闭合子图易懂证明

最大权闭合子图

content

先作出以下声明:

c(u,v):c(u,v):c(u,v):(u,v)(u,v)(u,v) 的容量。

f(u,v):f(u,v):f(u,v):(u,v)(u,v)(u,v) 的流量。

[S,T]:[S,T]:[S,T]: 符号表示一个边集 {(u,v)∣(u,v)∈E,u∈S,v∈T}\Big\{(u,v)\ \Big |\ (u,v)\in E,u\in S,v\in T\Big\}{(u,v)  (u,v)E,uS,vT}

c[S,T]:c[S,T]:c[S,T]: 将流网络 G=(V,E)G=(V,E)G=(V,E) 的点集划分成 S,T(S+T=V)S,T(S+T=V)S,T(S+T=V) 两个完全不交的部分,源 s∈Ss\in SsS,汇 t∈Tt\in TtT,的割的容量。

容量最小的割即为一个网络的最小割。

问题引入:

一个有向图 G=(V,E)G=(V,E)G=(V,E) 的闭合图 G′(V′,E′)G'(V',E')G(V,E) 是原图的一个点集,且该点集的所有出边仍指向该点集。

∀(u,v)∈E,u∈V′⇒v∈V′\forall_{(u,v)\in E},u\in V'\Rightarrow v\in V'(u,v)E,uVvV

给每个点定义一个点权 www,最大权闭合图就是权和最大的闭合图,即最大化 ∑v∈V′wv\sum_{v\in V'}w_vvVwv

利用网络流的最小割进行快速求解,形式化的建图如下:

将图转化为网络 N=(VN,EN)N=(V_N,E_N)N=(VN,EN),添入源点汇点 s,ts,ts,t
{VN=V⋃{s,t}EN=E⋃{e=(s,v)∣v∈V,wv>0}⋃{e=(v,t)∣v∈V,wv<0}c(u,v)=∞e=(u,v)∈Ec(s,v)=wvwv>0c(v,t)=−wvwv<0\begin{cases} V_N=V\bigcup \{s,t\}\\ E_N=E\bigcup \{e=(s,v)|v\in V,w_v>0\}\bigcup\{e=(v,t)|v\in V,w_v<0\}\\ c(u,v)=∞\quad\quad e=(u,v)\in E\\ c(s,v)=w_v\quad \quad w_v>0\\ c(v,t)=-w_v\quad\ w_v<0 \end{cases} VN=V{s,t}EN=E{e=(s,v)vV,wv>0}{e=(v,t)vV,wv<0}c(u,v)=e=(u,v)Ec(s,v)=wvwv>0c(v,t)=wv wv<0
定义:若一个 s−ts-tst 割满足割中每条边都只与源点或汇点相连,则称该割为简单割。

根据定义可得,网络 NNN 的简单割是不含原图 GGG 中边集 EEE 的任意一条边的。

  • 引理1

    网络 NNN 的最小割是简单割。

    证明:

    网络 NNN 的边分为与源或汇关联,容量有限和不与源汇关联(原边集 EEE 中所有边),容量无限的两种。

    所有与源或汇关联的边组成的割集的容量是有限的,为所有点权的绝对值和。

    最小割容量也至多为该绝对值和。

    故最小割不可能取任何容量为正无限的边,即最小割是简单割。

作出以下声明:

记简单割 [S,T][S,T][S,T] 将网络 NNN 的点集 VNV_NVN 划分为点集 SSS 及其补集 T(T=VN−S)T(T=V_N-S)T(T=VNS),且 s∈S,t∈Ts\in S,t\in TsS,tT

设闭合图为 V1V_1V1,则其在 VVV 中补集为 V1ˉ\bar{V_1}V1ˉ

V+V^+V+VVV 中点权为正的点集,V−V^-VVVV 中点权为负的点集。

同样可以这么定义 V1+,V1−,V1ˉ+,V1ˉ−V_1^+,V_1^-,\bar{V_1}^+,\bar{V_1}^-V1+,V1,V1ˉ+,V1ˉ

  • 引理2

    网络 NNN 的简单割 [S,T][S,T][S,T] 与图 GGG 的闭合图 V1V_1V1 存在一一对应的关系。
    V1⋃{s}=SV_1\bigcup \{s\}=SV1{s}=S

    证明:

    • 闭合图对应简单割,即 S=V1⋃{s},V1ˉ⋃{t}S=V_1\bigcup\{s\},\bar{V_1}\bigcup\{t\}S=V1{s},V1ˉ{t}

      反证法。若存在 (u,v)∈E,u∈S−{s}=V1,v∈T−{t}=V1ˉ(u,v)\in E,u\in S-\{s\}=V_1,v\in T-\{t\}=\bar{V_1}(u,v)E,uS{s}=V1,vT{t}=V1ˉ,使得 [S,T][S,T][S,T] 含不与源汇关联的边。则闭合图 V1V_1V1 有一个后继不在闭合图内,矛盾。

    • 简单割对应闭合图,即 V1=S−{s}V_1=S-\{s\}V1=S{s} 是闭合图。

      对于闭合图中 ∀u∈V1\forall_{u\in V_1}uV1,考虑任意一条由 uuu 引出的边 (u,v)∈E(u,v)\in E(u,v)E,由于简单割 [S,T][S,T][S,T] 不含 EEE 中任意一条边,所以 v≠T−{t}=V1ˉv\neq T-\{t\}=\bar{V_1}v=T{t}=V1ˉ。即 v∈V1v\in V_1vV1,符合闭合图定义。

  • 推论

    c[S,T]=∑v∈V1ˉ+wv+∑v∈V1−(−wv)c[S,T]=\sum_{v\in \bar{V_1}^+}w_v+\sum_{v\in V_1^-}(-w_v)c[S,T]=vV1ˉ+wv+vV1(wv)

    证明:

    可以将割 [S,T][S,T][S,T] 按照与源汇的关联分为三个部分:[S,T]=[{s},V1ˉ]⋃[{t},V1]⋃[V1,V1ˉ]:[S,T]=[\{s\},\bar{V_1}]\bigcup[\{t\},V_1]\bigcup[V_1,\bar{V_1}]:[S,T]=[{s},V1ˉ][{t},V1][V1,V1ˉ]

    由于 [S,T][S,T][S,T] 是简单割,所以 [V1,V1ˉ]=∅V_1,\bar{V_1}]=\emptyV1,V1ˉ]=

    因为源只与点权为正的点相连,所以 [{s},V1ˉ]=[{s},V1ˉ+][\{s\},\bar{V_1}]=[\{s\},\bar{V_1}^+][{s},V1ˉ]=[{s},V1ˉ+]

    因为汇只与点权为负的点相连,所以 [{t},V1]=[{t},V1−][\{t\},V_1]=[\{t\},V_1^-][{t},V1]=[{t},V1]

  • 定理

    当网络 NNN 取最小割时,对应的闭合图达到最大权。

    证明:

    按照定义,闭合图的权和可以表示为:∑v∈V1+wv−∑v∈V1−(−wv)\sum_{v\in V_1^+}w_v-\sum_{v\in V_1^-}(-w_v)vV1+wvvV1(wv)
    w(V1)+c[S,T]=∑v∈V1+wv−∑v∈V1−(−wv)+∑v∈V1ˉ+wv+∑v∈V1−(−wv)w(V_1)+c[S,T]=\sum_{v\in V_1^+}w_v-\sum_{v\in V_1^-}(-w_v)+\sum_{v\in \bar{V_1}^+}w_v+\sum_{v\in V_1^-}(-w_v)w(V1)+c[S,T]=vV1+wvvV1(wv)+vV1ˉ+wv+vV1(wv)=∑v∈V1+wv+∑v∈V1ˉ+wv=∑v∈V+wv=\sum_{v\in V_1^+}w_v+\sum_{v\in \bar{V_1}^+}w_v=\sum_{v\in V^+}w_v =vV1+wv+vV1ˉ+wv=vV+wv
    w(V1)=∑v∈V+wv−c[S,T]w(V_1)=\sum_{v\in V^+}w_v-c[S,T]w(V1)=vV+wvc[S,T]

    因为 ∑v∈V+wv\sum_{v\in V^+}w_vvV+wv 是原图 GGG 中所有正权点之和,是常数。

    所以最大化闭合图权和,就得最小化简单割的容量,而最小割是简单割。得证。

复杂度就是求最小割的复杂度。

exercise

[NOI2006]最大获利

#include <bits/stdc++.h>
using namespace std;
#define maxn 60005
#define inf 0x7f7f7f7f
queue < int > q;
struct node { int to, nxt, flow; }E[maxn << 3];
int head[maxn], cur[maxn], dep[maxn];
int n, m, s, t, cnt;int read() {int x = 0; char s = getchar();while( s < '0' or s > '9' ) s = getchar();while( '0' <= s and s <= '9' ) {x = ( x << 1 ) + ( x << 3 ) + ( s ^ 48 );s = getchar();}return x;
}bool bfs() {memset( dep, 0, sizeof( dep ) );dep[s] = 1; q.push( s );while( ! q.empty() ) {int u = q.front(); q.pop();for( int i = cur[u] = head[u];~ i;i = E[i].nxt ) {int v = E[i].to;if( ! dep[v] and E[i].flow ) {dep[v] = dep[u] + 1;q.push( v );}}}return dep[t];
}int dfs( int u, int cap ) {if( u == t or ! cap ) return cap;int flow = 0;for( int i = cur[u];~ i;i = E[i].nxt ) {cur[u] = i; int v = E[i].to;if( dep[v] == dep[u] + 1 ) {int w = dfs( v, min( cap, E[i].flow ) );if( ! w ) continue;E[i ^ 1].flow += w;E[i].flow -= w;flow += w;cap -= w;if( ! cap ) break;}}return flow;
}int dinic() {int ans = 0;while( bfs() ) ans += dfs( s, inf );return ans;
}int id( int x, int y ) { return ( x - 1 ) * m + y; }bool inside( int x, int y ) {if( x < 1 or x > n or y < 1 or y > m ) return 0;return 1;
}void addedge( int u, int v, int w ) {E[cnt] = { v, head[u], w };head[u] = cnt ++;E[cnt] = { u, head[v], 0 };head[v] = cnt ++;
}int main() {memset( head, -1, sizeof( head ) );scanf( "%d %d", &n, &m );s = 0, t = n + m + 1;int sum = 0;for( int i = 1, x;i <= n;i ++ )addedge( s, i, x = read() );for( int i = 1;i <= m;i ++ ) {int a = read(), b = read(), c = read();addedge( a, i + n, inf );addedge( b, i + n, inf );addedge( i + n, t, c );sum += c;}sum -= dinic();printf( "%d\n", sum );return 0;
}

最大密度子图

content

问题引入:

给定一张图 G=(V,E)G=(V,E)G=(V,E),从中选一个子图 G′=(V′,E′)G'=(V',E')G=(V,E) 使得其密度 D=∣E′∣∣V′∣D=\frac{|E'|}{|V'|}D=VE 最大。最大化并输出这个 DDD

重新函数化上述式子:D=f(x)=∑e∈Exe∑v∈Vxv,x∈{0,1}D=f(x)=\frac{\sum_{e\in E}x_e}{\sum_{v\in V}x_v},x\in\{0,1\}D=f(x)=vVxveExe,x{0,1}

以下简记 ∣V∣=n,∣E∣=m|V|=n,|E|=mV=n,E=m

这个式子跟 0/1分数规划 有着异曲同工之妙。

同样考虑二分结果 ggg

记:h(g)=max⁡x{∑e∈Exe−∑v∈Vxv∗g}h(g)=\max_x\Big\{\sum_{e\in E}x_e-\sum_{v\in V}x_v*g\Big\}h(g)=maxx{eExevVxvg}

记:问题最终答案为 ansansans,则 ∀G′=(n,m)mn≤ans\forall_{G'=(n,m)}\frac{m}{n}\le ansG=(n,m)nmans
{h(g)=0⇒g=ansh(g)>0⇒g<ansh(g)<0⇒g>ans\begin{cases} h(g)=0\Rightarrow g=ans\\ h(g)>0\Rightarrow g<ans\\ h(g)<0\Rightarrow g>ans \end{cases} h(g)=0g=ansh(g)>0g<ansh(g)<0g>ans
确定二分查找范围:[1n,m1][\frac{1}{n},\frac{m}{1}][n1,1m]

确定精度误差:1n2\frac{1}{n^2}n21

  • 引理1

    无向图 GGG 中,任意两个具有不同密度的子图 G1,G2G_1,G_2G1,G2,其密度差不小于 1n2\frac{1}{n^2}n21

证明:

不妨假设 G1G_1G1 子图的密度大于 G2G_2G2 子图的密度。

m1n1−m2n2=m1n2−m2n1n1n2≥1n1n2≥1n2\frac{m_1}{n_1}-\frac{m_2}{n_2}=\frac{m_1n_2-m_2n_1}{n_1n_2}\ge \frac{1}{n_1n_2}\ge\frac{1}{n^2}n1m1n2m2=n1n2m1n2m2n1n1n21n21

  • 推论

    对于无向图 GGG 而言,如果存在密度为 DDD 的子图 G′G'G,且不存在密度 ≥D\ge DD 的子图,则 G′G'G 为最大密度子图。


接下来考虑如何求解二分答案对应的最大子图密度值 h(g)h(g)h(g)

  • 引理2

    当点集确定时,点集的诱导子图一定是最优解。

诱导子图:从原图 G<V,E>G<V,E>G<V,E> 中选出一个子图 G′=(V′,E′)G'=(V',E')G=(V,E)∀u,v∈V′\forall_{u,v\in V'}u,vV 必有 e=(u,v)∈E′e=(u,v)\in E'e=(u,v)E,即全选子图点集内部的边。

考虑假设点集被确定为 V′V'V,如何继续求解子图 G′=(V′,E′)G'=(V',E')G=(V,E)

正向思维就是直接把点集中两两点之间的边选出来。但这里我们不采取这样的做法,因为暴力无法优化。

考虑逆向思维,将与点集 V′V'V 相关的所有边集去除掉不是 E′E'E 中的边集。

具体而言,用 ∑v∈V′dv−\sum_{v\in V'}d_v-vVdv 红色边再除以 222di:id_i:idi:i 点的度数。除以 222 是因为 EEE 的边被两个端点都算了一次。

在这里插入图片描述

红色边的图上意义就是连接 VVVV−V′V-V'VV 两个完全不交的点集的边。

这就有一种「割」的意味了。

由于是要最大化 ∣E′∣−g⋅∣V′∣|E'|-g·|V'|EgV,乘以 −1-11 ,转化为最小化 g⋅∣V′∣−∣E′∣g·|V'|-|E'|gVE

g⋅∣V′∣−∣E′∣=∑v∈V′g−∑e∈E′1=∑v∈V′g−∑v∈V′dv−c[V′,V−V′]2g·|V'|-|E'|=\sum_{v\in V'}g-\sum_{e\in E'}1=\sum_{v\in V'}g-\frac{\sum_{v\in V'}d_v-c[V',V-V']}{2}gVE=vVgeE1=vVg2vVdvc[V,VV]=12(∑v∈V′(2g−dv)+c[V′,V−V′])=\frac{1}{2}\Big(\sum_{v\in V'}(2g-d_v)+c[V',V-V']\Big)=21(vV(2gdv)+c[V,VV])

∑v∈V′(2g−dv)\sum_{v\in V'}(2g-d_v)vV(2gdv),就是选了 vvv,就要花费代价 2g−dv2g-d_v2gdv, 这相当于每个点多了个 2g−dv2g-d_v2gdv 的点权。

常见处理,让 V′V'V 中的点都与 ttt 相连,把点权赋成边权。

由于最小割只接受非负边权,但点权可能为负数,那么就把所有边权都加上一个极大值 BigBigBig,保证非负,最后再减去即可。

总结,形式化地将图 G=(V,E)G=(V,E)G=(V,E) 转化为网络 N=(VN,EN)N=(V_N,E_N)N=(VN,EN)
{VN=V⋃{s,t}EN={(u,v)∣(u,v)∈E}⋃{(s,v)∣v∈V}⋃{(v,t)∣v∈V}c(u,v)=1(u,v)∈Ec(s,v)=Bigv∈Vc(v,t)=Big+2g−dvv∈V\begin{cases}V_N=V\bigcup\{s,t\}\\E_N=\{(u,v)|(u,v)\in E\}\bigcup\{(s,v)|v\in V\}\bigcup\{(v,t)|v\in V\}\\c(u,v)=1\quad\quad\quad\quad\quad\quad(u,v)\in E\\c(s,v)=Big\quad\quad\quad\quad\quad\ v\in V\\c(v,t)=Big+2g-d_v\quad v\in V\end{cases} VN=V{s,t}EN={(u,v)(u,v)E}{(s,v)vV}{(v,t)vV}c(u,v)=1(u,v)Ec(s,v)=Big vVc(v,t)=Big+2gdvvV

  • 引理3

    网络 NNN 的一个割 [S,T][S,T][S,T] 与原图 GGG 的子图 G′=(V′,E′)G'=(V',E')G=(V,E) 方案存在一一对应关系。即 V′⋃{s}=SV'\bigcup\{s\}=SV{s}=S

    因为割可以是任意划分的,子图也可以是任意划分的。

  • 定理

    网络 NNN 的一个最小割 [S,T][S,T][S,T] ,其根据 引理2 所对应子图 G′G'Gh(g)h(g)h(g) 的一个最优解。

    证明:

    c[S,T]c[S,T]c[S,T] 为网络 NNN 的任意一个割的容量。根据 引理3 V’=S−{s},V′ˉ=T−{t}V’=S-\{s\},\bar{V'}=T-\{t\}V=S{s},Vˉ=T{t}
    c[S,T]=∑u∈S,v∈Tc(u,v)=∑v∈V′ˉc(s,v)+∑v∈V′c(v,t)+∑u∈V′,v∈V′ˉ,(u,v)∈Ec(u,v)c[S,T]=\sum_{u\in S,v\in T}c(u,v)=\sum_{v\in \bar{V'}}c(s,v)+\sum_{v\in V'}c(v,t)+\sum_{u\in V',v\in \bar{V'},(u,v)\in E}c(u,v)c[S,T]=uS,vTc(u,v)=vVˉc(s,v)+vVc(v,t)+uV,vVˉ,(u,v)Ec(u,v)=∑v∈V′ˉBig+∑v∈V′Big+2g−dv+∑u∈V′,v∈V′ˉ,(u,v)∈E1=\sum_{v\in \bar{V'}}Big+\sum_{v\in V'}Big+2g-d_v+\sum_{u\in V',v\in \bar{V'},(u,v)\in E}1=vVˉBig+vVBig+2gdv+uV,vVˉ,(u,v)E1=Big⋅∣V∣+∑u∈V′(2g−du+∑v∈V′ˉ,(u,v)∈E1)=Big·|V|+\sum_{u\in V'}\Big(2g-d_u+\sum_{v\in \bar{V'},(u,v)\in E}1\Big)=BigV+uV(2gdu+vVˉ,(u,v)E1)=Big⋅∣V∣+∑u∈V′(2g−∑v∈V′,(u,v)∈E1)=Big·|V|+\sum_{u\in V'}\Big(2g-\sum_{v\in V',(u,v)\in E}1\Big)=BigV+uV(2gvV,(u,v)E1)=Big∗n+2g∣V′∣−2∣E′∣=Big*n+2g|V'|-2|E'|=Bign+2gV2E=U∗n−2(∣E′∣−g∣V′∣)=U*n-2(|E'|-g|V'|) =Un2(EgV)
    E′E'E 已重定义为 V′V'V 的导出子图的边集。

    U∗nU*nUn 为定值,当割取最小的时候,2(∣E′∣−g∣V′∣)2(|E'|-g|V'|)2(EgV) 取最大。即 h(g)=U∗n−c[S,T]2h(g)=\frac{U*n-c[S,T]}{2}h(g)=2Unc[S,T],其中 [S,T][S,T][S,T] 为最小割。

参考选摘:胡伯涛《最小割模型在信息学竞赛中的应用》

exercise

UVA Hard Life

#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define maxn 100005
struct node { int to, nxt; double flow; }E[maxn];
struct Node { int u, v; }edge[maxn];
queue < int > q;
int n, m, s, t, cnt;
int head[maxn], cur[maxn], dep[maxn], d[maxn];
bool vis[maxn];void addedge( int u, int v, double w1, double w2 ) {E[cnt] = { v, head[u], w1 };head[u] = cnt ++;E[cnt] = { u, head[v], w2 };head[v] = cnt ++;
}void build( double g ) {memset( head, -1, sizeof( head ) ); cnt = 0;for( int i = 1;i <= m;i ++ ) addedge( edge[i].u, edge[i].v, 1, 1 );for( int i = 1;i <= n;i ++ ) addedge( s, i, m, 0 ), addedge( i, t, m + 2 * g - d[i], 0 );
}bool bfs() {memset( dep, 0, sizeof( dep ) );dep[s] = 1; q.push( s );while( ! q.empty() ) {int u = q.front(); q.pop();for( int i = cur[u] = head[u];~ i;i = E[i].nxt ) {int v = E[i].to;if( ! dep[v] and E[i].flow > 0 ) {dep[v] = dep[u] + 1;q.push( v );}}}return dep[t];
}double dfs( int u, double cap ) {if( u == t or cap <= 0 ) return cap;double flow = 0;for( int i = cur[u];~ i;i = E[i].nxt ) {cur[u] = i; int v = E[i].to;if( dep[v] == dep[u] + 1 ) {double w = dfs( v, min( cap, E[i].flow ) );if( w <= 0 ) continue;E[i ^ 1].flow += w;E[i].flow -= w;flow += w;cap -= w;if( cap <= 0 ) break;}}return flow;
}double dinic( double g ) {build( g );double ans = 0;while( bfs() ) ans += dfs( s, 2e9 );return ans;
}void dfs( int now ) {if( vis[now] ) return;vis[now] = 1;if( now ^ s ) cnt ++;for( int i = head[now];~ i;i = E[i].nxt )if( E[i].flow > 0 ) dfs( E[i].to );
}int main() {while( ~ scanf( "%d %d", &n, &m ) ) {s = 0, t = n + 1;for( int i = 0;i <= n;i ++ ) vis[i] = d[i] = 0;for( int i = 1, u, v;i <= m;i ++ ) {scanf( "%d %d", &u, &v );edge[i] = { u, v };d[u] ++, d[v] ++;}double l = 0, r = m, eps = 1.0 / double(n * n);while( r - l > eps ) {double mid = ( l + r ) / 2;if( m * n - dinic( mid ) > eps ) l = mid;else r = mid;}dinic( l );cnt = 0;dfs( s );if( ! cnt ) printf( "1\n1\n" );else {printf( "%d\n", cnt );for( int i = 1;i <= n;i ++ )if( vis[i] ) printf( "%d\n", i );}}return 0;
}

Upd:最大权闭合子图易懂证明

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316806.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker最全教程之使用Docker搭建Java开发环境(十八)

前言Java是一门面向对象的优秀编程语言&#xff0c;市场占有率极高&#xff0c;但是在容器化实践过程中&#xff0c;发现官方支持并不友好&#xff0c;同时与其他编程语言的基础镜像相比&#xff08;具体见各语言镜像比较&#xff09;&#xff0c;确实是非常臃肿。本篇仅作探索…

AT2705 [AGC019F] Yes or No(组合数学)

解析 Atcoder的题超小的码量总让人做不出来的时候感到很不甘心… 但这题确实挺难的&#xff0c;主要还是魔术一样的奇淫技巧。 大力推式子那个阴间方法我直接选择弃疗。 一个很显然的结论是&#xff1a;肯定回答当前剩的比较多的选项。 pia一张洛谷的图&#xff1a; &#…

ASP.NET Core 项目简单实现身份验证及鉴权

环境VS 2017ASP.NET Core 2.2目标以相对简单优雅的方式实现用户身份验证和鉴权&#xff0c;解决以下两个问题&#xff1a;无状态的身份验证服务&#xff0c;使用请求头附加访问令牌&#xff0c;几乎适用于手机、网页、桌面应用等所有客户端基于功能点的权限访问控制&#xff0c…

ML.NET 发布0.11版本:.NET中的机器学习,为TensorFlow和ONNX添加了新功能

微软发布了其最新版本的机器学习框架&#xff1a;ML.NET 0.11带来了新功能和突破性变化。新版本的机器学习开源框架为TensorFlow和ONNX添加了新功能&#xff0c;但也包括一些重大变化, 这也是发布RC版本之前的最后一个预览版&#xff0c;这个月底将发布0.12版本&#xff0c;也就…

如何使用AWS和Azure的配置存储服务保存读取配置

原文&#xff1a;Want to yank configuration values from your .NET Core apps? 作者&#xff1a;pauljwheeler译文&#xff1a;https://www.cnblogs.com/lwqlun/p/10508748.html译者&#xff1a;Lamond Lu示例源代码&#xff1a;https://github.com/lamondlu/LoadConfigurat…

Meaningless Sequence Gym - 102832D

Meaningless Sequence Gym - 102832D 题意&#xff1a; 给你n和c&#xff0c;an的公式如下图 让你求a0…an的和&#xff0c;mod 1e97 题解&#xff1a; 训练时推了好一阵子才和队友推出 我看网上正解为&#xff1a; 一个数的大小与它的二进制表示中的1的个数有关 ac(二进制…

【.NET Core项目实战-统一认证平台】第十六章 网关篇-Ocelot集成RPC服务

一、什么是RPCRPC是“远程调用&#xff08;Remote Procedure Call&#xff09;”的一个名称的缩写&#xff0c;并不是任何规范化的协议&#xff0c;也不是大众都认知的协议标准&#xff0c;我们更多时候使用时都是创建的自定义化&#xff08;例如Socket&#xff0c;Netty&#…

.net Core2.2 WebApi通过OAuth2.0实现微信登录

前言微信相关配置请参考 微信公众平台 的这篇文章。注意授权回调域名一定要修改正确。微信网页授权是通过OAuth2.0机制实现的&#xff0c;所以我们可以使用 https://github.com/china-live/QQConnect 这个开源项目提供的中间件来实现微信第三方登录的流程。开发流程1、新建一个…

Nginx优化(重点)与防盗链(新版)

Nginx优化(重点)与防盗链 Nginx优化(重点)与防盗链一、隐藏Nginx版本号1、修改配置文件2、修改源代码 二、修改Nginx用户与组1、编译安装时指定用户与组2、修改配置文件指定用户与组 三、配置Nginx网页的缓存时间四、实现Nginx的日志切割1、data的用法2、编写脚本进行日志切割的…

CodeForces730E Award Ceremony(拓扑排序+结论)

CF730E. Award Ceremonyproblemsolutioncodeproblem 题目链接 题目大意&#xff1a; 给出 nnn 个队封榜时的榜单 aia_iai​ 和揭榜时的变化情况 did_idi​。 揭榜时&#xff0c;这个队的名次会变化 tit_iti​。 注意在别的队揭榜时&#xff0c;自己队的排名也是动态变化的…

.Netcore 2.0 Ocelot Api网关教程(番外篇)- Ocelot v13.x升级

由于Ocelot系列博客好久没更新&#xff08;差不多有10个月的时间了&#xff09;&#xff0c;在此先说声抱歉&#xff0c;Ocelot系列会继续更新下去。在写上一篇配置管理的时候发现官方文档已经和以前的不一样&#xff0c;而Ocelot也从5.0版本更新到了13.x版本&#xff0c;进行了…

CF765F Souvenirs(暴力、线段树)

解析 比较神奇的一道题。 考虑一个常规套路&#xff1a;把询问离线&#xff0c;移动右端点&#xff0c;维护左端点答案。 考虑暴力维护&#xff0c;对于当前的 aixa_ixai​x&#xff0c;左侧如图所示的这两条线上的点都可以产生新的可能答案。 容易构造使得单次产生的新点是…

Hard Disk Drive HDU - 4788

Hard Disk Drive HDU - 4788 题意&#xff1a; 通常制造商认为1“kilo”等于1000&#xff0c;但操作系统会认为是1024。 因此&#xff0c;当你购买了一个100MB的硬盘&#xff0c;电脑却只显示大约有95MB&#xff0c;这缺失了大约5MB。 对于硬盘的大小&#xff0c;有多种单位描…

ASP.NET Core 沉思录 - 环境的思考

我的博客换新家啦&#xff0c;新的地址为&#xff1a;https://clrdaily.com :-D今天我们来一起思考一下如何在不同的环境应用不同的配置。这里的配置不仅仅指 IConfiguration 还包含 IWebHostBuilder 的创建过程和 Startup 的初始化过程。0 太长不读环境造成的差异在架构中基本…

深度:从 Office 365 新图标来看微软背后的设计新理念

开始表演请关注我的公众号“寒树Office”来获取一些新鲜而有趣的新闻与知识&#xff0c;最近又有两家俱乐部上线了&#xff08;东莞与长沙&#xff09;&#xff0c;俱乐部的活动告一段落&#xff0c;接下来的日子里我将持续与大家分享 Office 365 的精彩内容&#xff0c;这次很…

NET Core微服务之路:实战SkyWalking+Exceptionless体验生产下追踪系统

前言当一个APM或一个日志中心实际部署在生产环境中时&#xff0c;是有点力不从心的。比如如下场景分析的问题&#xff1a;从APM上说&#xff0c;知道某个节点出现异常&#xff0c;或延迟过过高&#xff0c;却不能及时知道日志反馈情况&#xff0c;总不可能去相应的节点上一个一…

.NET 中创建支持集合初始化器的类型

对象初始化器和集合初始化器只是语法糖&#xff0c;但是能让你的代码看起来更加清晰。至少能让对象初始化的代码和其他业务执行的代码分开&#xff0c;可读性会好一些。本文将编写一个类型&#xff0c;可以使用集合初始化器构造这个类型。不只是添加元素的集合初始化器&#xf…

【无码专区8】三角形二维数点——计数有多少个给定点落在三角形区域内

因为只有std&#xff0c;没有自我实现&#xff0c;所以是无码专区 主要是为了训练思维能力 solution才是dls正解&#xff0c;但是因为只有潦草几句&#xff0c;所以大部分会有我自己基于正解上面的算法实现过程&#xff0c;可能选择的算法跟std中dls的实现不太一样。 std可能…

为什么我的会话状态在ASP.NET Core中不工作了?

原文&#xff1a;Why isnt my session state working in ASP.NET Core? Session state, GDPR, and non-essential cookies作者&#xff1a;Andrew Lock译文&#xff1a;https://www.cnblogs.com/lwqlun/p/10526380.html译者&#xff1a;Lamond Lu在本篇博客中&#xff0c;我将…

现身说法:实际业务出发分析百亿数据量下的多表查询优化

今天给大家带来的讨论主题是通过实战经验来对百亿数据量下的多表数据查询进行优化&#xff0c;俗话说的好&#xff0c;一切脱离业务的架构都是耍流氓&#xff0c;接下来我就整理一下今天早上微信群里石头哥给大家分享的百亿数据量多表查询架构以及优化思路。由于本文内容整理自…