网络流及建模专题(上)

前言

不断更新中……
这几天新坑填不下去了,回来回顾一些经典的模型套路,先拿网络流开刀,窃以为洛谷这几道网络流的题目还是非常具有代表性的,涵盖了网络流调整多解计数最小割最大权闭合子图问题。
还涵盖了图论(二分图)中的一些结论和:最小不相交路径覆盖、最小可相交路径覆盖、二分图最大点权独立集、二分图最小点权覆盖集等问题,这里将简略介绍一下。

本专题包含六道题:P2765、P2764、P2763、P2766、P2774、P2805

P2765 网络流调整技巧
P2763 二分图多重匹配问题
P2764 最小不相交路径覆盖、最小可相交路径覆盖
P2766 一类dp计数问题、最多不相交路径
P2774 二分图最大点权独立集、二分图最小点权覆盖集
P2805 最大权闭合子图

前提

  • 知道网络流的基本用法。
  • 知道最大流最小割定理。
  • 知道二分图的定义。
  • 有一个稳定好用的Dinic求网络流的板子。

P2765 魔术球问题

前言

这道题应该可以通过贪心的方法过,不过既然放在了网络流专题里面,我们就认真的用网络流试一试并总结一下经验。

题解

添加一个小球相当于在网络中出现了一个从源点SSS到汇点TTT的流量。

分析一下题目:同一个柱子的小球要求可以与前一个小球形成和为完全平方数的情况,当一个新的小球到来的时候,可以加入其中的一根柱子,当然也可以另外开启一个新的柱子,使用的柱子的总数不得超过nnn

我们另开一个节点T′T'T用来表示柱子的上限,连接一条容量为nnn的边(T′,T)(T',T)(T,T)

我们尝试把小球拆成两个点BBBB′B'B,并且由SSSBBB连接一条容量为111的边。由B′B'BTTT连接一条容量为111的边,为什么容量为111?这限制了每个球后面都只能紧邻地放一个球。

如果数大的小球与某个数小的小球之间组合满足和为完全平方数(即大球可以放在小球后面),我们就从连接一条容量为111的边(B大球,B小球′)(B_{大球},B_{小球}')(B,B)。这代表该大球可以放在小球后面不需要开启新的柱子。

每个球都可以连接一条容量为111的边(B,T′)(B,T')(B,T)。代表该小球独立开启了一个新的柱子。

如下图所示:
这里写图片描述
回顾一下这张图:
BBB流向T′T'T的流量代表BBB球开启了一个新的柱子,而从B大球B_{大球}BB小球′B_{小球}'B的流量代表B大球B_{大球}B放在了B小球B_{小球}B的后面。

这只是建图模型,我们在解决这道题的时候不能跑一遍网络流完事,而是需要使用迭代加深搜索的思想,增量式建图,每次加入一个球,然后在残余网络中跑最大流,判断能否跑满,如果跑不满,那么答案就是上次跑满时候的结果。

最后,这道题要求输出方案,我们只需要在残余网络里面遍历去边的容量,然后就可以得到方案了,这里不必细说,看我的代码就可以了。

参考代码 见附录

放置、匹配的问题,都可以往网络流方面思考。


P2764 最小路径覆盖

什么是最小路径覆盖?

最小路径覆盖分为两种

  • 最小不相交路径覆盖
  • 最小可相交路径覆盖

最小不相交路径覆盖的做法

构造一个新图,将一个点BBB拆成B1B_1B1B2B_2B2两个点,在原图中如果有边(A,B)(A,B)(A,B)那么在新图中连接边(A1,B2)(A_1,B_2)(A1,B2)
然后形成了一张二分图,结论就是最小不相交路径覆盖=原图节点数-二分图的最大匹配

如何理解这个过程呢?

一开始每个点都是一条路径。
在二分图中,每形成一个匹配,就相当于一条路径将匹配两边的点给合并了,也就是合并了两个路径,这样一直匹配下去,路径数就在不断的减少,所以最终形成的就是最小路径覆盖,最后的路径数就是一开始原图的节点数-匹配数。

最小可相交路径覆盖的做法

这个问题与本题没有关系,只是扩展,可以暂时跳过。
解这个小问的方法是把这个问题化归到最小不相交路径覆盖上去。

可相交也就是说如果两点可达,那么不管这两点中间有多少节点,我都可以去经过。

先跑出可达矩阵,用Floyd算法,算出两两点之间的可达性。
然后如果两两可达,则建边。建成新图以后,就变成了最小不相交路径覆盖问题了。

理解

但是如果两个点a和b是连通的,只不过中间需要经过其它的点,那么可以在这两个点之间加边,那么a就可以直达b,不必经过中点的,那么就转化成了最小不相交路径覆盖。

这道题同样需要输出方案,在残余网络中遍历边处理就可以了。

参考代码 见附录


P2763 试题库问题

我觉得这是一个非常典型的二分图问题。

kkk种类型是二分图左侧的kkk个点。

nnn个试题是二分图右侧的nnn个点。

如果某试题属于某种类型,就在试题和类型之间连接一条边,容量为111

要求选出numnumnumttt类型的题目,那么就在源点SSSttt类型点之间加入一条容量为numnumnum的边。

而每道题目只能使用一次,因此在题目ppp和汇点TTT之间连接一条容量为111的边。

然后跑一遍最大流就可以得到答案了。
这里写图片描述

参考代码见附录


P2766 最长不下降子序列问题

这类问题属于动态规划方程已知,对解方案计数的问题。
还有的是要求最短路的数量的问题,我之前有在我的博客里写过,感兴趣的各位可以找找看。

第一问

要求求出最长不下降子序列长度,这个使用动态规划很容易解决,但是我们必须要在这一步中处理出以a[i]a[i]a[i]元素为结尾的最长非降子序列的长度数组f[i]f[i]f[i]

第二问

要求在所有的点都不能重复使用的时候,能找到多少个最长非减子序列。

在网络流处理问题的模型中,如果一个点不能重复利用,那么我们可以将这个点PPP拆成两个点PsP_sPsPtP_tPt,并由PsP_sPsPtP_tPt连接一条容量为111的边。所有流入这个点的边都与PsP_sPs相连,所有流出这个点的边都与PtP_tPt相连。

在这个题中,我们从f[i]f[i]f[i]数组出发,建立一个DAG(有向无环图)。即满足f[j]+1=f[i]f[j]+1=f[i]f[j]+1=f[i]a[j]≤a[i]a[j] ≤ a[i]a[j]a[i](j,i)(j,i)(j,i)我们都建立一条iiijjj的容量为infinfinf的边。

然后建立一个超级源点SSS,和超级汇点TTTSSSf[i]==mxlenf[i] == mxlenf[i]==mxlen的点iii连边,TTTf[i]==1f[i] == 1f[i]==1的点iii连边,容量均为111
然后按照我上面说的方法拆点。
举例:
3,6,2,53,6,2 ,53,6,2,5
这个序列的mxlen=2mxlen=2mxlen=2,f[]=1,2,1,2f[]={1,2,1,2}f[]=1,2,1,2,我们建成的图就是:
这里写图片描述
这样的话,跑一遍最大流就知道有多少条长度为mxlenmxlenmxlen的不相交的路径了。

第三问

若某个点可以无限用的话,那么这个点就不应该被拆。

对第二问的图稍做修改,如下
这里写图片描述

这里有个小细节xnx_nxnx1x_1x1直接相连接的时候,他们之间的边权不能设为 infinfinf而应该是111

另一个小细节就是如果mxlen==1mxlen==1mxlen==1那么直接输出nnn不需要建图。

参考代码 见附录

P2774 方格取数问题

由这个问题引出的模型是二分图最大点权独立集

二分图点权最大独立集:带点权二分图G中的一个子集V,其中一条边的两个端点不能同时属于V,且V中点权和最大。

二分图最大点权独立集对偶问题的是二分图的最小点权覆盖集,即用最小点权和的点集去覆盖所有的边,解法就是按照如下的方法建图跑最小割。

相邻的格子数不能同时取到,他们两个是互斥的,我们对格子进行黑白染色以后,形成了一张二分图,这个问题转化为求这张二分图的最大点权独立集

这种模型可以采用求最小割的方法来做

SSS点向白点连边,容量为白点的权值,从黑点向TTT点连边,容量为黑点的权值。
白点和黑点之间如果有互斥关系,那么从白点向黑点连接一条容量为infinfinf的边,形成一张网络图。

我们观察这张图的最小割,我们发现容量为infinfinf的边一定不能被割掉,那么这条边两端的点u,vu,vu,v就必然有(S,u)(S,u)(S,u)被割掉或者是(v,T)(v,T)(v,T)被割掉,被割掉的含义就是这个点的权值我不要了。由于我们得到的是最小割,也就是说我们剩下的点的权值之和一定是最大的,且不互斥的,因此用总的权值和减去最小个的值就是最大权独立集的权值和,也就是本题的答案。

例如下图的答案就是
这里写图片描述
ans=(a+b+c+d+e+f)−(a+b+d+e)=c+fans = (a+b+c+d+e+f) - (a+b+d+e) = c+fans=(a+b+c+d+e+f)(a+b+d+e)=c+f

##参考代码 见附录


P2805 植物大战僵尸

这个问题要引出的模型就更厉害啦!
那就是:
最大权闭合子图
最大权闭合子图
最大权闭合子图
重要的问题说三遍,这个模型很重要,能解决非常多有趣的问题,主要被用来解决在有依赖性条件下的规划问题。

什么是最大权闭合子图?

闭合子图的定义是:在子图中,所有点的出边所指向的节点仍在该子图内。

这里写图片描述

在这张图中,闭合子图有:
{E}、{D,E}、{F,E}、{A,D,E}、{B,D,E}、{F,E}、{C,F,E}\{E\}、\{D,E\}、\{F,E\}、\{A,D,E\}、\{B,D,E\}、\{F,E\}、\{C,F,E\}{E}{D,E}{F,E}{A,D,E}{B,D,E}{F,E}{C,F,E}

最大权闭合子图就是找一个最大的权值和的闭合子图。

如何找最大权闭合子图?

我们把这个图进行变形,变形成可以用最小割解决的问题,然后用最小割解决它。
变形方法:**如果一个点的权值为正,那么从SSS点向该点连接一条容量为权值的边,如果这个点的权值为负,那么从该点向TTT点连接一条容量为权值绝对值的边,原图中的所有边容量均设置为infinfinf。**然后跑一遍最小割,原图中正的点权和减去最小割得到的就是最大权闭合子图。

证明这里就不证明了,有兴趣的同学可以去网上搜搜看。

如何解决依赖关系下的选取问题?

如果要选取物品AAA必须要先选取物品BBB,则说物品AAA依赖于物品BBB,反映在图中就是AAABBB连有一条边。

选取某个物品可能获利也有可能要付出代价,如果获利则说该物品的权值符号为正,如果获取该物品要付出代价,则说该物品的权值符号为负。

而一种选取方案则必然属于原图中的一个闭合子图,如果不闭合这个选取方案必然非法。

因此,求一种获利最大的选取方案就相当于在求一个最大权闭合子图。

这道题怎么做?

这道题中,僵尸只能从每一行的最右端开始吃,想吃(x,y)(x,y)(x,y)位置的植物必须先吃掉(x,y+1)(x,y+1)(x,y+1)位置的植物,这样的话,就形成了一个依赖关系(x,y)(x,y)(x,y)依赖于(x,y+1)(x,y+1)(x,y+1),写作(x,y)−>(x,y+1)(x,y)->(x,y+1)(x,y)>(x,y+1)
本题中还有另外的一个依赖关系,那就是某植物AAA可以保护其他一些植物BBB,也就是存在依赖关系:(xB,yB)−>(xA,yA)(x_B,y_B)->(x_A,y_A)(xB,yB)>(xA,yA)
根据这些依赖关系,以及吃掉植物的获利,我们可以建立一张图。

然后在这张图求一个最大权闭合子图,就是我们的答案。

但是我们忽略了一点,就是说可能存在无敌植物,这些植物的依赖关系形成了一个环,这样就不能直接跑最大权闭合子图了,所以,我们第一步要先去掉这张依赖关系图中的。使用什么来去环呢?答案是拓扑排序。

先观察可能出现环的情形:
这里写图片描述

这种情形下,环应该被去掉,因为环代表无敌关系。而依赖于环的点JJJ也应该被去掉,因为环被去掉了以后这个依赖关系永远不能成立。

如何去掉环和依赖于环的点?

其实很简单,我们将图中所有的边反向,使用拓扑排序,将所有没有被访问的节点去掉。
这一步的核心操作就在反向

去掉点之后,直接跑最大权闭合子图就可以了。

参考代码 见附录


附录

Dinic网络流模板

以下代码均不含模板

const int inf = 1e9;
const int maxm = 800001;
const int maxn = 10001;
int node,src,dest,edge;
int ver[maxm],flow[maxm],nxt[maxm];
int head[maxn],work[maxn],dis[maxn],q[maxn];
void prepare(int _node,int _src,int _dest)
{node=_node,src=_src,dest=_dest;for(int i=0; i<node; ++i)head[i]=-1;edge=0;
}
void addedge(int u,int v,int c)
{ver[edge]=v,flow[edge]=c,nxt[edge]=head[u],head[u]=edge++;ver[edge]=u,flow[edge]=0,nxt[edge]=head[v],head[v]=edge++;
}
bool Dinic_bfs()
{int i,u,v,l,r=0;for(i=0; i<node; ++i)dis[i]=-1;dis[q[r++]=src]=0;for(l=0; l<r; ++l)for(i=head[u=q[l]]; i>=0; i=nxt[i])if(flow[i]&&dis[v=ver[i]]<0){dis[q[r++]=v]=dis[u]+1;if(v==dest)return 1;}return 0;
}
int Dinic_dfs(int u,int exp)
{if(u==dest)return exp;for(int &i=work[u],v,tmp; i>=0; i=nxt[i])if(flow[i]&&dis[v=ver[i]]==dis[u]+1&&(tmp=Dinic_dfs(v,min(exp,flow[i])))>0){flow[i]-=tmp;flow[i^1]+=tmp;return tmp;}return 0;
}
int Dinic_flow()
{int i,ret=0,delta;while(Dinic_bfs()){for(i=0; i<node; ++i)work[i]=head[i];while(delta=Dinic_dfs(src,inf))ret+=delta;}return ret;
}

P2765

// 网络流模板省去
int n,m = 2000;
int main(){scanf("%d",&n);prepare(2*m+3,0,2*m+2);addedge(2*m+1,2*m+2,n);for(int i = 1;;++i){addedge(0,2*i-1,1);addedge(2*i-1,2*m+1,1,1);addedge(2*i,2*m+2,1);for(int j = 1;j < i;++j){int rt = sqrt(i+j+0.5);if(rt*rt == i+j) addedge(2*i-1,2*j,1,2);}int ans = Dinic_flow();if(ans < i){printf("%d\n",i-1);int vc = 0;//生成方案vector<int> G[n];vector<int> bl(i,-1);for(int e = 0;e < edge;e += 2){if(flow[e] != 0) continue;if(tps[e] == 1){int u = (ver[e+1]+1)/2;G[vc].push_back(u);bl[u] = vc;vc++;}else if(tps[e] == 2){int u = (ver[e+1]+1)/2;int v = (ver[e]+1)/2;bl[u] = bl[v];G[bl[u]].push_back(u);}}for(int i = 0;i < n;++i){for(auto v : G[i]) printf("%d ",v);puts("");}break;}}return 0;
}

P2764

int pnxt[maxn];
int deg[maxn];
int n,m;
int main(){cin>>n>>m;prepare(2*n+2,0,2*n+1);for(int i = 0;i < m;++i){int u,v;scanf("%d%d",&u,&v);addedge(u,n+v,1);}for(int i = 1;i <= n;++i) addedge(0,i,1),addedge(i+n,2*n+1,1);int ans = Dinic_flow();for(int e = 0;e < 2*m;e += 2){if(flow[e] == 0){int u = ver[e+1];int v = ver[e] - n;pnxt[u] = v;deg[v]++;}}for(int i = 1;i <= n;++i){if(deg[i]) continue;int v = i;while(v){printf("%d ",v);v = pnxt[v];}puts("");}cout<<n-ans<<endl;return 0;
}

P2763

int n,k;
int kn[30];
int main(){cin>>k>>n;prepare(1+k+n+1,0,1+k+n);for(int i = 1;i <= k;++i) cin>>kn[i];for(int i = 1;i <= k;++i) addedge(0,i,kn[i]);for(int i = 1;i <= n;++i){int num;scanf("%d",&num);for(int j = 1;j <= num;++j){int tt;scanf("%d",&tt);addedge(tt,i+k,1,1);}}for(int i = 1;i <= n;++i) addedge(i+k,1+k+n,1);int ans = Dinic_flow();vector<int> G[30];for(int e = 0;e < edge;++e){if(flow[e] == 0 && tps[e]){int u = ver[e+1];int v = ver[e]-k;G[u].push_back(v);}}for(int i = 1;i <= k;++i){printf("%d: ",i);for(auto v : G[i]) printf("%d ",v);puts("");}return 0;
}

P2766

int n,dp[507],f[507],a[507];
int main(){memset(dp,0x3f,sizeof(dp));cin>>n;for(int i = 1;i <= n;++i){int tmp;cin>>tmp;a[i] = tmp;int loc = upper_bound(dp+1,dp+1+n,tmp) - dp;f[i] = loc;dp[loc] = tmp;}int s = lower_bound(dp+1,dp+1+n,0x3f3f3f3f)-dp-1;cout<<s<<endl;prepare(2*n+2,0,2*n+1);for(int i = n;i >= 1;--i){addedge(i,i+n,1);if(f[i] == s) addedge(0,i,505);if(f[i] == 1) addedge(i+n,2*n+1,505);for(int j = i-1;j >= 1;--j){if(f[j]+1 == f[i] && a[j] <= a[i]) addedge(i+n,j,505);}}cout<<Dinic_flow()<<endl;if(s == 1) {return 0*printf("%d\n",n);}prepare(2*n+2,0,2*n+1);for(int i = n;i >= 1;--i){addedge(i,i+n,1);if(f[i] == s){if(i == n) addedge(0,i+n,505);else addedge(0,i,505);}    if(f[i] == 1){if(i == 1) addedge(i,2*n+1,505);else addedge(i+n,2*n+1,505);}for(int j = i-1;j >= 1;--j){if(j == 1 && i == n) continue;if(f[j]+1 == f[i] && a[j] <= a[i]) addedge(i+n,j,505);}}int ans = Dinic_flow();if(f[1] + 1 == f[n]) ans ++;cout<<ans<<endl;
}

P2774

int n,m;
int a[101][101];
int dx[] = {-1,1,0,0};
int dy[] = {0,0,-1,1};
int main(){long long sum = 0;cin>>m>>n;for(int i = 1;i <= m;++i){for(int j = 1;j <= n;++j) {scanf("%d",&a[i][j]);sum += a[i][j];}}prepare(n*m+2,0,n*m+1);for(int i = 1;i <= m;++i){for(int j = 1;j <= n;++j){int u = (i-1)*n+j;if((i+j)%2 == 0) addedge(0,u,a[i][j]);else addedge(u,n*m+1,a[i][j]);if((i+j)%2 == 0)for(int t = 0;t < 4;++t){int nx = i + dx[t],ny = j + dy[t];if(nx < 1 || nx > m || ny < 1 || ny > n) continue;int v = (nx-1)*n+ny;addedge(u,v,inf);}}}cout<<sum - Dinic_flow()<<endl;return 0;
}

P2805

typedef pair<int,int> pii;
int a[100][100];
vector<pii> ps[100][100];
int n,m;
long long sum;
#define pr(x) cout<<#x<<":"<<x<<endl
int main(){//freopen("ts3.txt","r",stdin);cin>>n>>m;prepare(n*m+2,0,n*m+1);for(int i = 1;i <= n;++i){for(int j = 1;j <= m;++j){int num;scanf("%d%d",&a[i][j],&num);for(int t = 0;t < num;++t){int x,y;scanf("%d%d",&x,&y);x++,y++;ps[i][j].push_back(make_pair(x,y));}if(j != 1) ps[i][j].push_back(make_pair(i,j-1));}}void toposort();toposort();long long ans = (long long)Dinic_flow();cout<<sum-ans<<endl;
}
int deg[30][31],vis[31][31],f[31][31];
void toposort(){queue<pii> Q;for(int ux = 1;ux <= n;++ux) for(int uy = 1;uy <= m;++uy){for(auto p : ps[ux][uy]) { deg[p.first][p.second] ++;}}for(int ux = 1;ux <= n;++ux) for(int uy = 1;uy <= m;++uy){if(!deg[ux][uy]) Q.push(make_pair(ux,uy));}while(!Q.empty()){pii p = Q.front();Q.pop();sum += max(0,a[p.first][p.second]); vis[p.first][p.second] = 1;for(auto p2:ps[p.first][p.second]){deg[p2.first][p2.second]--;if(deg[p2.first][p2.second]==0) Q.push(p2);}}for(int ux = 1;ux <= n;++ux) for(int uy = 1;uy <= m;++uy){if(!vis[ux][uy]) continue;for(auto p : ps[ux][uy]) {if(vis[p.first][p.second]) addedge((p.first-1)*m+p.second,(ux-1)*m+uy,inf);}if(a[ux][uy] >= 0) addedge(0,(ux-1)*m+uy,a[ux][uy]);else addedge((ux-1)*m+uy,n*m+1,-a[ux][uy]);}}

原创:西安交大 蔡少斐

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

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

相关文章

基于 websocket 实现的 im 实时通讯案例

分享利用 redis 订阅与发布特性&#xff0c;巧妙的现实高性能im系统。为表诚意&#xff0c;先贴源码地址&#xff1a;https://github.com/2881099/im下载源码后的运行方法&#xff1a;运行环境&#xff1a;.NETCore 2.1 redis-server 2.8下载Redis-x64-2.8.2402.zip&#xff0…

ACM/ICPC 比赛生涯总结+经验分享

ACM/ICPC 比赛生涯总结经验分享 1.获奖经历 时间比赛奖励大一下ACM陕西省赛打铁大一下CCCC团队二等奖大二下ACM/ICPC全国邀请赛银奖大二下CCCC团队特等奖大三上ACM/ICPC区域赛沈阳站铜奖大三上ACM/ICPC区域赛南宁站银奖大三上ACM/ICPC EC-Final上海铜奖大三下CCCC团队特等奖大…

NCC Meetup 2018 Shanghai 活动小结

NCC Meetup 2018 上海的活动于2018年6月30日在微软上海港汇办公室进行。原本计划30人规模的小型活动&#xff0c;结果收到了逾60人的报名&#xff0c;其中大部均来到现场参加了活动。本次活动得到了微软公司的场地支持&#xff0c;同时非常感谢 范亮先生、 刘浩杨先生和 邹嵩…

Asp.Net Core 使用Quartz基于界面画接口管理做定时任务

今天抽出一点点时间来造一个小轮子&#xff0c;是关于定时任务这块的。这篇文章主要从一下几点介绍&#xff1a;创建数据库管理表创建web项目引入quarzt nuget 包写具体配置操作&#xff0c;实现定时任务处理第一步&#xff1a;创建一个空web项目&#xff0c;引入quarzt nuget …

.NET Core微服务之服务间的调用方式(REST and RPC)

一、REST or RPC ?1.1 REST & RPC微服务之间的接口调用通常包含两个部分&#xff0c;序列化和通信协议。常见的序列化协议包括json、xml、hession、protobuf、thrift、text、bytes等&#xff1b;通信比较流行的是http、soap、websockect&#xff0c;RPC通常基于TCP实现&am…

【记忆化搜索】【dfs】【递归】Chocolate

Chocolate 题目大意&#xff1a; 有一块巧克力&#xff08;每一个单位有一定的美味值&#xff09;&#xff0c;判断是否可以把他分为k块美味值相等的小巧克力 原题&#xff1a; 题目描述 Charlie 有一块巧克力。 这块巧克力是矩形的&#xff0c;有 n 行 m 列一共 n m 个大…

Nuget 多平台多目标快速自动打包

构建现代的 .Net 应用离不开 Nuget 的支持&#xff0c;而快速打包 Nuget 成了提高生产率的有效方法。1. 前置条件为了实现 Nuget 的快速打包&#xff0c;我们需要先解决一些前置依赖&#xff0c;无论是 .Net Framework、Mono 或者 .Net Standard&#xff08;.Net Core&#xff…

Identity Server 4 - Hybrid Flow - 使用ABAC保护MVC客户端和API资源

这个系列文章介绍的是Identity Server 4 实施 OpenID Connect 的 Hybrid Flow. 保护MVC客户端: Identity Server 4 - Hybrid Flow - MVC客户端身份验证, Identity Server 4 - Hybrid Flow - Claims保护API资源(这里用到了RBAC: Role-based Access Control 基于角色的访问权限控…

【图论】【并查集】矩形(ssl 1222)

矩形 ssl 1222 题目大意&#xff1a; 有n个矩阵&#xff0c;现在将有重叠部分的两个矩阵合并成一个图形&#xff0c;问有多少个图形 原题&#xff1a; 题目描述 在一个平面上有n个矩形。每个矩形的边都平行于坐标轴并且都具有值为整数的顶点。我们用如下的方式来定义块。…

Asp.Net Core Web Api图片上传及MongoDB存储实例教程(一)

图片或者文件上传相信大家在开发中应该都会用到吧&#xff0c;有的时候还要对图片生成缩略图。那么如何在Asp.Net Core Web Api实现图片上传存储以及生成缩略图呢&#xff1f;今天我就使用MongoDB作为图片存储&#xff0c;然后使用SixLabors作为图片处理&#xff0c;通过一个As…

FFT算法学习笔记

写在前边 1.辣鸡RRRR_wys之前csdn的博客&#xff0c;千年不更。。。还很水。。。于是开了这个Blog。。。妄图拯救一下自己 2.最近接触了一些多项式理论。于是翘掉了愉快的高频自控&#xff0c;通过《算导》稍稍学习了一下 3.算法竞赛中&#xff0c;FFT主要解决多项式的乘法等问…

System.IO.Pipelines: .NET高性能IO

本文翻译自dotnet团队博客文章&#xff1a;https://blogs.msdn.microsoft.com/dotnet/2018/07/09/system-io-pipelines-high-performance-io-in-net/ System.IO.Pipelines是一个新的库&#xff0c;旨在简化在.NET中执行高性能IO的过程。它是一个依赖.NET Standard的库&#xff…

.NET+PostgreSQL实践与避坑指南

简介.NETPostgreSQL(简称PG)这个组合我已经用了蛮长的一段时间&#xff0c;感觉还是挺不错的。不过大多数人说起.NET平台&#xff0c;还是会想起跟它“原汁原味”配套的Microsoft SQL Server(简称MSSQL)&#xff0c;其实没有MSSQL也没有任何问题&#xff0c;甚至没有Windows Se…

Jimu : .Net Core 分布式微服务框架介绍

一、前言近些年一直浸淫在 .Net 平台做企业应用开发&#xff0c;用过的 .Net 框架不多&#xff08;具体数量不清&#xff0c;印象深刻的有 Asp.Net MVC&#xff0c;WPF&#xff0c;其他很多都是基于微软开发的框架做些封装而形成新的框架&#xff0c;大都是还没起好名就湮灭在历…

.NetCore2.1 WebAPI 根据swagger.json自动生成客户端代码

前言上一篇博客中我们可以得知通过Swagger插件可以很方便的提供给接口开发者在线调试&#xff0c;但是实际上Swagger附带的功能还有很多&#xff0c;比如使用NSwag生成客户端调用代码&#xff0c;进一步解放接口开发者。NSwag NSwag是一个发布在GitHub上的开源项目&#xff0c;…

使用.NetCore 控制台演示 熔断 降级(polly)

1、熔断降级的概念&#xff1a; 熔断&#xff1a;我这里有一根长度一米的钢铁&#xff0c;钢铁的熔点1000度&#xff08;假设&#xff09;&#xff0c;现在我想用力把这根钢铁折弯&#xff0c;但是人的力有限达不到折弯的点&#xff0c;然后我使用火给钢铁加热&#xff0c;每隔…

给正在努力的您几条建议(附开源代码)

前言我是一名在广州的某家互联网公司工作&#xff0c;并有6年工作经验&#xff0c;奔着架构师与微软MVP为目标的老鸟程序员。最近回顾了下多年来走的路&#xff0c;有不少的弯路。今天不说技术&#xff0c;而是总结了一些职业生涯上的建议与大家分享。虽说今天不说技术&#xf…

.Net Core Cors中间件解析

同源策略和资源跨域共享1、同源策略同源策略&#xff0c;它是由Netscape提出的一个著名的安全策略。现在所有支持JavaScript 的浏览器都会使用这个策略。所谓同源是指&#xff0c;域名&#xff0c;协议&#xff0c;端口相同。1.1、目的主要是为了保证用户信息的安全&#xff0c…

用Way.EntityDB进行Entity Framework Core数据库建模

Way.EntityDB是一个基于EF Core的数据层框架&#xff0c;它取消了EF Core的Migration机制&#xff0c;因为Migration并不是通用的&#xff0c;比如说sql server生成的migration&#xff0c;如果换成sqlite&#xff0c;运行时会报错的&#xff0c;也就是数据库不能更换。Way.Ent…

.NET Core开发日志——Runtime IDentifier

.NET Core对于传统.NET开发人员而言是既熟悉又陌生的新平台&#xff0c;所以有时遇上出乎意料的事情也纯属正常情况。这时只需点耐心&#xff0c;多查查资料&#xff0c;努力找到原因&#xff0c;也未尝不是件有意义的体验。比如当建完一个最简单的控制台应用程序&#xff1a;d…