当前位置: 首页 > 编程日记 > 正文

2-sat问题,输出方案,几种方法(赵爽的论文染色解法+其完全改进版)浅析 / POJ3683...

本文原创于  复习之用,有新体会,故重新编辑。

2014-02-12 09:26:

2-sat之第二斩!昨天看了半天论文(赵爽的和俉昱的),终于看明白了!好激动有木有!终于理解了赵爽的每一句话!并且用了200+行代码实现,A了!具体过程我是敲了帮天的代码啊!!!不容易啊!步骤如下:

把相关问题编号为01 23 45....,(每个编号为一个命题)奇数为取,偶数不取,那么相邻俩个互逆,于是根据具体情况(check)一下,建立图,tarjan判断有无解,然后顺便再缩点,重新建图(逆图),在对新图拓扑,仔细阅读下面赵爽的话:理解每一句:

如果没有产生矛盾,我们就可以把处在同一个强连通分量中的点和边缩成一个点,得到         
新的有向图G。然后,我们把G中的所有弧反向,得到图G ′ ′ ′′。
现在我们观察 。由于已经进行了缩点的操作,因此 G′′ G′′中一定不存在圈,也就是说,
具有拓扑结构。  G′′
我们把G中所有顶点置为“未着色”。按照拓扑顺序重复下面的操作:  ′′           是啊,先对新图(逆的)拓扑,保存起来,然后开始染色,对每个染成“不选”的还要对其子孙也不选 择,(再次dfs。。。无奈),废了半天啊!!!!下面第一段代码便是!!
1、 选择第一个未着色的顶点x。把x染成红色。
2、 把所有与x矛盾的顶点 (如果存在bb yjjB ¬ ∈ ,且b属于 j
x代表的强连
通分量, j
b ¬ 属于 代表的强连通分量,那么 y x和 就是互相矛盾的顶点)
及其子孙全部全部染成蓝色。
y
3、 重复操作1和2,直到不存在未着色的点为止。此时,G′′中被染成红色的
点在图G中对应的顶点集合,就对应着该2-SAT的一组解。

后来在大牛交流中,发现无需拓扑啊!白痴啊!尽在眼前还去自己写什么??!!了解到:每个强连通分量都是在它的所有后继强连通分量被求出之后求得的。因此,如果将同一强连通分量收缩为一个结点而构成一个有向无环图,这些强连通分量被求出的顺序是这一新图的逆拓扑序!!!!
不用再次新图拓扑啊!!!何必多此一举!于是来了第二个代码!!

还没完???的确,染色?大牛证明了(现在证明看来也很容易的),无须如此!直接tarjan即可!详见代码三!!又简单了许多啊!从此,2-sat输出方案,哦?不用怕!!!!so easy!

继续刷几题,练练新剑!

今//三种代码:一次比一次简单,第一次完全按论文进行模拟的,比较繁琐,但是思路清晰,包括俩次建图+拓扑+染色+tarjan+dfs,

建图是关键,每次添加的边要互为假言易位式(一对),最后一种方法最妙,以后都用这样的方法,简单又快捷;

该题题意:某一天结婚的人特别多但是主持婚礼的神父只有一个。婚礼时间从s开始到e结束,神父必须在s到s+d或者e-d到e这段时间内在。给定了n个婚礼的s,e,d,求一种方案能使得神父主持所有的婚礼。

思路:建图简单,数据处理一下,按编号保存,之后:遍历点,取矛盾的点添加假言易位边,缩点(同一个SCC中必然可以互推)来判断有无解,输出方案的话,只需新图(不必真的建),每次取逆拓扑小的(scc[i]小的命题即可)(反证即可)。


#include<iostream>  //5340K	360MS
#include<cstdio>
#include<cstring>
#include<vector>
#include<stack>
#include<cmath>
using namespace std;
int n;const int MAX=2001;
struct points      //点,01,23,45.。。相连为一对,x^1取对应点(改变奇偶性)
{int from,end;
};
points  point[MAX];
int low[MAX];int dfn[MAX];int visited[MAX];bool is_instack[MAX];stack<int>s;
int times=0; int scc[MAX]; int numblock;
int indgree[MAX]; int tuopoxuliu[MAX]; int color[MAX];  //入度,tuopo序列,染色
vector<int>ans(MAX);              //最终答案
vector<vector<int> >edges(MAX);  //原图
vector<vector<int> >newgraph(MAX); //新图
vector<vector<int> >SCC(MAX);       //保存SCC【i】含有的点
void initialize()
{numblock=times=0;for(int i=0;i<2*n;i++){tuopoxuliu[i]=color[i]=visited[i]=low[i]=dfn[i]=is_instack[i]=0;edges[i].clear();scc[i]=-1;}
}
void tarjan(int u)    //有向图dfs,这个不解释
{low[u]=dfn[u]=++times;is_instack[u]=1;s.push(u);int len=edges[u].size();for(int i=0;i<len;i++){int v=edges[u][i];if(visited[v]==0){visited[v]=1;tarjan(v);if(low[u]>low[v])low[u]=low[v];}else if(is_instack[v]&&dfn[v]<low[u]){low[u]=dfn[v];}}if(dfn[u]==low[u]){numblock++;int cur;do{cur=s.top();is_instack[cur]=0;s.pop();scc[cur]=numblock;SCC[numblock].push_back(cur);     //每个SCC对应哪些点保存起来}while(cur!=u);}
}
bool agst(points a,points b)    //判断矛盾的点
{if(a.from<=b.from&&a.end>b.from)     //注意==号的判定!别因为这个跪了!return true;if(b.from<=a.from&&b.end>a.from)return true;return false;
}
bool build_graph_has_solution()           //建图
{initialize();for(int i=0;i<2*n;i++)for(int j=i+1;j<2*n;j++){if(((i>>1)!=(j>>1))&&agst(point[i],point[j]))     //有时间冲突{if(agst(point[i],point[j^1]))    //和另一个也矛盾,那么i不能选(用A->非A表示)edges[i].push_back(i^1);else{edges[i].push_back(j^1);              //那么选你没我edges[j].push_back(i^1);}}}for(int i=0;i<2*n;i++){if(visited[i]==0){visited[i]=1;tarjan(i);}}for(int i=0;i<2*n;i+=2){if(scc[i]==scc[i+1])   //矛盾的点在一个SCC中,{printf("NO\n");return false;}}return true;
}
void tuopu()              //新图拓扑,记录拓扑序列(1-numblock)保存之
{stack<int>sta;int count=1;for(int i=1;i<=numblock;i++)    //入度点0点if(indgree[i]==0)sta.push(i);while(!sta.empty()){int cur=sta.top();sta.pop();tuopoxuliu[count++]=cur;int len4=newgraph[cur].size();     //新图,其孩子入度--for(int i=0;i<len4;i++){indgree[newgraph[cur][i]]--;if(indgree[newgraph[cur][i]]==0)sta.push(newgraph[cur][i]);}}
}
void dfs_unchoose(int u)        //u及其子孙都不选
{int len5=newgraph[u].size();for(int i=0;i<len5;i++){int v=newgraph[u][i];if(color[v]!=2){color[v]=2;dfs_unchoose(v);}}
}
void solve()
{for(int i=0;i<2*n;i++)              //建立新图(逆图,有向无环){int len=edges[i].size();for(int j=0;j<len;j++){int v=edges[i][j];bool mark=0;if(scc[i]!=scc[v])         //是新图的边      //注意下面哪些是SCC[]{int len2=newgraph[scc[v]].size();       //删去新图重边(要判断入度)for(int k=0;k<len2;k++){if(newgraph[scc[v]][k]==scc[i]){mark=1;break;}}if(mark)continue;newgraph[scc[v]].push_back(scc[i]);        //逆图indgree[scc[i]]++;}}}tuopu();for(int i=1;i<=numblock;i++)         //开始染色,{int cur=tuopoxuliu[i];if(color[cur]==0)                 //0未染色{color[cur]=1;                  //标记选择int len3=SCC[cur].size();      //SCC中,for(int j=0;j<len3;j++){color[scc[SCC[cur][j]^1]]=2;       //这些点矛盾的点所在的SCC标记为2(不选).dfs_unchoose(scc[((SCC[cur][j])^1)]);  //其子孙也不选}}}                                       //染色完毕for(int i=1;i<=numblock;i++)          //统计ans{if(color[i]==1)                   //在同一个SCC中全要{int len6=SCC[i].size();for(int j=0;j<len6;j++){ans[SCC[i][j]/2]=SCC[i][j];}}}printf("YES\n");for(int i=0;i<n;i++){int hour=point[ans[i]].from/60;int miu=point[ans[i]].from%60;printf("%02d:%02d ",hour,miu);hour=point[ans[i]].end/60; miu=point[ans[i]].end%60;printf("%02d:%02d\n",hour,miu);}
}
void readin()
{for(int i=0;i<n;i++){int a1,b1,a2,b2,d;char c;scanf("%d%c%d",&a1,&c,&b1); scanf("%d%c%d",&a2,&c,&b2); scanf("%d",&d);point[i*2].from=a1*60+b1;      point[i*2].end=a1*60+b1+d;point[i*2+1].from=a2*60+b2-d;  point[i*2+1].end=a2*60+b2;}
}
int main()
{scanf("%d",&n);readin();if( build_graph_has_solution())solve();
}

.
#include<cstdio>
#include<cstring>
#include<vector>
#include<stack>
#include<cmath>
using namespace std;
int n;const int MAX=2001;
struct points      //点,01,23,45.。。相连为一对,x^1取对应点(改变奇偶性)
{int from,end;
};
points  point[MAX];
int low[MAX];int dfn[MAX];int visited[MAX];bool is_instack[MAX];stack<int>s;
int times=0; int scc[MAX]; int numblock;int color[MAX];                  //染色
vector<int>ans(MAX);              //最终答案
vector<vector<int> >edges(MAX);  //原图
vector<vector<int> >newgraph(MAX); //新图
vector<vector<int> >SCC(MAX);       //保存SCC【i】含有的点
void initialize()
{numblock=times=0;for(int i=0;i<2*n;i++){color[i]=visited[i]=low[i]=dfn[i]=is_instack[i]=0;edges[i].clear();scc[i]=-1;}
}
void tarjan(int u)           //有向图dfs,这个不解释
{low[u]=dfn[u]=++times;is_instack[u]=1;s.push(u);int len=edges[u].size();for(int i=0;i<len;i++){int v=edges[u][i];if(visited[v]==0){visited[v]=1;tarjan(v);if(low[u]>low[v])low[u]=low[v];}else if(is_instack[v]&&dfn[v]<low[u]){low[u]=dfn[v];}}if(dfn[u]==low[u]){numblock++;int cur;do{cur=s.top();is_instack[cur]=0;s.pop();scc[cur]=numblock;SCC[numblock].push_back(cur);     //每个SCC对应哪些点保存起来}while(cur!=u);}
}
bool agst(points a,points b)    //判断矛盾的点
{if(a.from<=b.from&&a.end>b.from)     //注意==号的判定!别因为这个跪了!return true;if(b.from<=a.from&&b.end>a.from)return true;return false;
}
bool build_graph_has_solution()           //建图
{initialize();for(int i=0;i<2*n;i++)for(int j=i+1;j<2*n;j++){if(((i>>1)!=(j>>1))&&agst(point[i],point[j]))     //有时间冲突{if(agst(point[i],point[j^1]))    //和另一个也矛盾,那么i不能选(用A->非A表示)edges[i].push_back(i^1);else{edges[i].push_back(j^1);              //那么选你没我edges[j].push_back(i^1);}}}for(int i=0;i<2*n;i++){if(visited[i]==0){visited[i]=1;tarjan(i);}}for(int i=0;i<2*n;i+=2){if(scc[i]==scc[i+1])   //矛盾的点在一个SCC中,{printf("NO\n");return false;}}return true;
}
void dfs_unchoose(int u)        //u及其子孙都不选
{int len5=newgraph[u].size();for(int i=0;i<len5;i++){int v=newgraph[u][i];if(color[v]!=2){color[v]=2;dfs_unchoose(v);}}
}
void solve()
{for(int i=0;i<2*n;i++)              //建立新图(逆图,有向无环){int len=edges[i].size();for(int j=0;j<len;j++){int v=edges[i][j];bool mark=0;if(scc[i]!=scc[v])         //是新图的边      //注意下面哪些是SCC[]{int len2=newgraph[scc[v]].size();       //删去新图重边(要判断入度)for(int k=0;k<len2;k++){if(newgraph[scc[v]][k]==scc[i]){mark=1;break;}}if(mark)continue;newgraph[scc[v]].push_back(scc[i]);        //逆图}}}for(int i=1;i<=numblock;i++)         //开始染色,{int cur=i;if(color[cur]==0)                 //0未染色{color[cur]=1;                  //标记选择int len3=SCC[cur].size();      //SCC中,for(int j=0;j<len3;j++){color[scc[SCC[cur][j]^1]]=2;       //这些点矛盾的点所在的SCC标记为2(不选).dfs_unchoose(scc[((SCC[cur][j])^1)]);  //其子孙也不选}}}                                       //染色完毕for(int i=1;i<=numblock;i++)          //统计ans{cout<<i<<": "<<endl;int len6=SCC[i].size();for(int j=0;j<len6;j++){cout<<SCC[i][j]<<" ";cout<<endl;if(color[i]==1)                   //在同一个SCC中全要{cout<<"get:";cout<<SCC[i][j]<<endl;ans[SCC[i][j]/2]=SCC[i][j];}}}printf("YES\n");for(int i=0;i<n;i++){int hour=point[ans[i]].from/60;int miu=point[ans[i]].from%60;printf("%02d:%02d ",hour,miu);hour=point[ans[i]].end/60; miu=point[ans[i]].end%60;printf("%02d:%02d\n",hour,miu);}
}
void readin()
{for(int i=0;i<n;i++){int a1,b1,a2,b2,d;char c;scanf("%d%c%d",&a1,&c,&b1); scanf("%d%c%d",&a2,&c,&b2); scanf("%d",&d);point[i*2].from=a1*60+b1;      point[i*2].end=a1*60+b1+d;point[i*2+1].from=a2*60+b2-d;  point[i*2+1].end=a2*60+b2;}
}
int main()
{scanf("%d",&n);readin();if( build_graph_has_solution())solve();
}

#include<iostream>  //无需自己拓扑!无需染色!无需重新建图!屌!以后不用怕了!直接秒杀!
#include<cstdio>
#include<cstring>
#include<vector>
#include<stack>
#include<cmath>
using namespace std;
int n;const int MAX=2001;
struct points      //点,01,23,45.。。相连为一对,x^1取对应点(改变奇偶性)
{int from,end;
};
points  point[MAX];
int low[MAX];int dfn[MAX];int visited[MAX];bool is_instack[MAX];stack<int>s;
int times=0; int scc[MAX]; int numblock;
vector<int>ans(MAX);               //最终答案
vector<vector<int> >edges(MAX);   //原图
void initialize()
{numblock=times=0;for(int i=0;i<2*n;i++){visited[i]=low[i]=dfn[i]=is_instack[i]=0;edges[i].clear();scc[i]=-1;}
}
void tarjan(int u)           //有向图dfs,这个不解释
{low[u]=dfn[u]=++times;is_instack[u]=1;s.push(u);int len=edges[u].size();for(int i=0;i<len;i++){int v=edges[u][i];if(visited[v]==0){visited[v]=1;tarjan(v);if(low[u]>low[v])low[u]=low[v];}else if(is_instack[v]&&dfn[v]<low[u]){low[u]=dfn[v];}}if(dfn[u]==low[u]){int cur; numblock++;do{cur=s.top();is_instack[cur]=0;s.pop();scc[cur]=numblock;}while(cur!=u);}
}
bool agst(points a,points b)    //判断矛盾的点
{if(a.from<=b.from&&a.end>b.from)     //注意==号的判定!别因为这个跪了!return true;if(b.from<=a.from&&b.end>a.from)return true;return false;
}
bool build_graph_has_solution()           //建图
{initialize();for(int i=0;i<2*n;i++)for(int j=i+1;j<2*n;j++){if(((i>>1)!=(j>>1))&&agst(point[i],point[j]))     //有时间冲突{if(agst(point[i],point[j^1]))    //和另一个也矛盾,那么i不能选(用A->非A表示)edges[i].push_back(i^1);else{edges[i].push_back(j^1);              //那么选你没我edges[j].push_back(i^1);}}}for(int i=0;i<2*n;i++){if(visited[i]==0){visited[i]=1;tarjan(i);}}for(int i=0;i<2*n;i+=2){if(scc[i]==scc[i+1])        //矛盾的点在一个SCC中,{printf("NO\n");return false;}}return true;
}
void solve()
{for(int i=0;i<2*n;i+=2)          //统计ans{if(scc[i]<scc[i+1])              //关键!!这样选择!!ans[i/2]=i;elseans[i/2]=i+1;}printf("YES\n");                for(int i=0;i<n;i++)              //还原{int hour=point[ans[i]].from/60;int miu=point[ans[i]].from%60;printf("%02d:%02d ",hour,miu);hour=point[ans[i]].end/60; miu=point[ans[i]].end%60;printf("%02d:%02d\n",hour,miu);}
}
void readin()
{for(int i=0;i<n;i++){int a1,b1,a2,b2,d;char c;scanf("%d%c%d",&a1,&c,&b1); scanf("%d%c%d",&a2,&c,&b2); scanf("%d",&d);point[i*2].from=a1*60+b1;      point[i*2].end=a1*60+b1+d;point[i*2+1].from=a2*60+b2-d;  point[i*2+1].end=a2*60+b2;}
}
int main()
{scanf("%d",&n);readin();if( build_graph_has_solution())solve();
}



转载于:https://www.cnblogs.com/yezekun/p/3925712.html

相关文章:

C#方法/函数

本节课向你介绍C#的方法&#xff0c;其目的是&#xff1a; 1.了解方法的结构格式2.了解静态和实例方法之间的区别3.学会实例对象的使用4.学会如何调用实例化的对象5.学会方法的四种参数类型的使用6.学会使用"this"引用以往&#xff0c;对于每个程序来说&#xff0c;所…

Python 的一万种用法:生成字符视频

作者 | ZackSock来源 | 新建文件夹X头图 | 下载于视觉中国前言在之前也写过生成字符视频的文章&#xff0c;但是使用的是命令行窗口输出&#xff0c;效果不是很好&#xff0c;而且存在卡顿的情况。于是我打算直接生成一个mp4的字符视频。大致思路和之前一样&#xff1a;Python2…

Codeforces 862B - Mahmoud and Ehab and the bipartiteness

862B - Mahmoud and Ehab and the bipartiteness 思路&#xff1a;先染色&#xff0c;然后找一种颜色dfs遍历每一个点求答案。 代码&#xff1a; #include<bits/stdc.h> using namespace std; #define ll long long #define pb push_back #define mem(a,b) memset(a,b,si…

C#表达式,类型和变量

本节课将介绍C# 语言的表达式&#xff0c;类型和变量。本节课要达到如下几个目的&#xff1a; 1.了解什么是"变量"2.学习C#的简单类型3.对C#表达式有个初步的了解4.了解什么是String类型5.学习如何使用数组"变量"仅仅是数据的存储位置。你可以把数据存放到…

张一鸣卸任CEO,立下10年之约,期望突破线性延伸

整理 | 寇雪芹头图 | 下载于视觉中国出品 | AI 科技大本营&#xff08;ID:rgznai100&#xff09;5月20日&#xff0c;字节跳动创始人张一鸣发布内部全员信&#xff0c;宣布卸任CEO&#xff0c;联合创始人梁汝波将接任这一职位。张一鸣在全员信中表示&#xff0c;“我决定卸任CE…

【译】使用Kotlin和RxJava测试MVP架构的完整示例 - 第1部分

原文链接&#xff1a;android.jlelse.eu/complete-ex… 最近我创建了一个playground项目来了解更多关于Kotlin和RxJava的信息。 这是一个非常简单的项目&#xff0c;但有一部分&#xff0c;我进行了一些尝试&#xff1a;测试。 在kotlin的测试上可能会有一些陷阱&#xff0c;而…

智能改变未来,创新引领世界,第二届深圳国际人工智能展暨智能制造创新高峰论坛盛大启幕!

2021年5月20日&#xff0c;由深圳市科学技术协会、深圳市商务局、深圳市福田区人民政府共同指导&#xff0c;深圳市科技开发交流中心、深圳市人工智能行业协会联合主办的2021第二届深圳国际人工智能展开幕式暨智能制造创新高峰论坛在深圳会展中心&#xff08;福田&#xff09;启…

C#循环控制语句

本节课将介绍如何使用C#控制语句中的循环语句&#xff0c;本课目的如下&#xff1a; 1.学会"while"循环的用法。2.学会"do" 循环的用法。3.学会"for" 循环的用法。4.学会foreach循环的用法。5.进一步了解"break"语句的用法。6.如何使用…

2017-09-22 前端日报

2017-09-22 前端日报 精选 JavaScript 在 V8 中的元素种类及性能优化【译】异步递归&#xff1a;回调、Promise、Async[译]HTML&CSS Lesson5: 定位一个页面阻塞问题的排查过程前端分享之cookie的使用及单点登录An event for CSS position:stickyanvaka/ngraph.path: Path f…

C#选择控制语句

本节课将介绍如何使用C#选择控制语句&#xff0c;第三课将达到如下几个目的&#xff1a; 1.学会"if"语句的用法。2.学会"switch"语句的用法。3.学会在"switch"语句中如何使用"break"语句。4.理解"goto"语句的正确用法。在前…

将博客搬至51CTO

将博客搬至51CTO转载于:https://blog.51cto.com/imace/1540730

腾讯国风AI虚拟人学会作诗书法,背靠开源模型SongNet

5月21日&#xff0c;腾讯AI虚拟人艾灵再秀出新技能&#xff0c;首次展示AI作诗、AI书法等国风才艺&#xff0c;并与青年歌手白举纲跨次元合作&#xff0c;共同演唱国风新歌《百川千仞》。 AI“艾灵”诞生于腾讯AI Lab&#xff0c;来自实验性、探索性技术项目“多模态虚拟人”。…

Windows10安装Mysql5.7.19.0 msi 版本报错

安装环境&#xff1a;Windows10安装版本&#xff1a;MySql 5.7.19.0 msi1.安装5.7.19.0 msi版本Mysql时报如下错误&#xff1a;2.根据日志分析是缺少visual Studio 2013 Redistributable3.下载完成后&#xff0c;安装仍然显示失败&#xff1a;4.在网上下载各种vs测试&#xff0…

C#简单的欢迎程序

本节课通过介绍几个简单的程序&#xff0c;使得你对C#有所入门。本节程要达到如下几个目的&#xff1a; 1.理解一个C#程序的基本结构。2.初步了解"名称空间"的概念。3.初步了解"类"的概念。4.了解"Main"方法所做的工作。5.学会如何读取命令行输入…

知乎联合清华:开放国内最大个性化推荐实际交互数据集

5月21日&#xff0c;知乎联合清华大学对外开放基于知乎的大规模富文本查询和推荐数据集“ZhihuRec”。该数据集包含了知乎上的1亿个行为数据&#xff0c;是目前为止&#xff0c;国内用于个性化推荐的最大的实际交互数据集。 作为一个大型数据集&#xff0c;ZhihuRec具有社交化问…

SQL Server 2014 许可证(五)降级与升级

“版本”一词对应的英文单词有两个&#xff1a;&#xff08;1&#xff09; Version是指不同历史时期发生的产品&#xff0c;或者指产品不同的“代”&#xff0c;例如&#xff0c;SQL Server 2014 版本。&#xff08;2&#xff09; Edition是指在发行同一代产品&#xff08;Vers…

OCM_第十二天课程:Section6 —》数据库性能调优_ 资源管理器/执行计划

注&#xff1a;本文为原著&#xff08;其内容来自 腾科教育培训课堂&#xff09;。阅读本文注意事项如下&#xff1a;1&#xff1a;所有文章的转载请标注本文出处。2&#xff1a;本文非本人不得用于商业用途。违者将承当相应法律责任。3&#xff1a;该系列文章目录列表&#xf…

赠书 | 联邦学习如何在视觉领域应用?

前言&#xff1a;联邦学习是如何应用在视觉领域的&#xff1f;本文将通过一个获得了2020年AAAI人工智能创新应用奖的案例来向大家介绍。本案例是联邦学习在视觉、物联网、安防领域的实际应用&#xff0c;对分散在各地的摄像头数据&#xff0c;通过联邦学习&#xff0c;构建一个…

AME_Oracle自带AME审批链详解AME Standard Handler(概念)

2014-05-30 Created By BaoXinJian Oracle 自带了3大类&#xff0c;13个子类的审批链Action Type, 对应了13个标准的AME Standard Handler 1. 按主管层次审批 absolute job level / chains of authority based on absolute job levelfinal approver only / chains of authorit…

c# 中如何定义和接收消息

在C#中目前我还没有找到发送消息的类成员函数&#xff0c;所以只能采用通过调用WIN 32 API 的 SendMessage() 函数实现。由于 SendMessage的参数中需要得到窗体的句柄(handler) &#xff0c;所以又要调用另一个API FindWindow(), 两者配合使用&#xff0c;达到在不同窗体之间的…

java如何读写json文件

java如何读写json文件 在实际项目开发中&#xff0c;有时会遇到一些全局的配置缓存&#xff0c;最好的做法是配置redis数据库作为数据缓存&#xff0c;而当未有配置redis服务器时&#xff0c;读取静态资源文件&#xff08;如xml、json等&#xff09;也是一种实现方式&#xff0…

C#数组篇讲解

数组是我们经常用到的&#xff0c;我来介绍一下&#xff1a;数组是具有相同类型的一组数据。当访问数组中的数据时&#xff0c;可以通过下标来指明。c#中数组元素可以为任何数据类型&#xff0c;数组下标从0开始&#xff0c;即第一个元素对应的下标为0&#xff0c;以后逐个递增…

Spring AOP详解(转载)所需要的包

上一篇文章中&#xff0c;《Spring Aop详解&#xff08;转载&#xff09;》里的代码都可以运行&#xff0c;只是包比较多&#xff0c;中间缺少了几个相应的包&#xff0c;根据报错&#xff0c;几经百度搜索&#xff0c;终于补全了所有包。 截图如下&#xff1a; 在主测试类里面…

Mendix 披露低代码方法论,解读真实技术趋势

作者 | 宋慧头图 | 下载于视觉中国出品 | AI 科技大本营&#xff08;ID:rgznai100&#xff09;在 2021年初正式宣布进入中国市场之后&#xff0c;Mendix 在近日向媒体重点披露了关于低代码的技术方法论&#xff0c;以及近四个月在中国市场的进展。Mendix 的低代码技术方法论对于…

PHP中foreach详细解读

oreach 语法结构提供了遍历数组的简单方式。foreach 仅能够应用于数组和对象&#xff0c;如果尝试应用于其他数据类型的变量&#xff0c;或者未初始化的变量将发出错误信息。有两种语法&#xff1a; foreach (array_expression as $value) statement foreach (array_expression…

Android ViewPager使用具体解释

这是谷歌官方给我们提供的一个兼容低版本号安卓设备的软件包&#xff0c;里面包囊了仅仅有在安卓3.0以上能够使用的api。而viewpager就是当中之中的一个利用它&#xff0c;我们能够做非常多事情&#xff0c;从最简单的导航&#xff0c;到页面菜单等等。那怎样使用它呢&#xff…

实时音视频的超级风口,开发者的机会在哪里?

2021年初因为Elon Musk“带货”而走红的音频社交App Clubhouse&#xff0c;又以肉眼可见的速度跌落神坛&#xff0c;下载量从2月的960 万/月跌至4月的92万/月。不过在5月&#xff0c;Clubhouse终于推出了安卓版&#xff0c;并表示接下来也会对所有用户开放。 另一边&#xff0c…

高可用集群之分布式文件系统

一、分布式文件系统和单机文件系统的区别&#xff1a;单机文件系统的分区只能被一台主机所挂载&#xff0c;不能同时被多台主机挂载使用&#xff0c;因为单机文件系统是通过系统内核层的锁机制来完成的&#xff0c;所以一个系统上可以有多个进程访问&#xff0c;但只能在一个时…

C#中基本知识

当数据转换到asp.net页面时&#xff0c;大部分都是以文本的形式存在的。有时候为了输出&#xff0c;单单使用显示或者隐式转换都是不行的&#xff0c;就需要本节说到的数据转换。 字符串输出&#xff1a; int intAge21; string strAgeintAge.ToString(); 转换DateTime值时&…

索引系列八--索引特性之有序难优化union

----UNION 是需要排序的drop table t1 purge;create table t1 as select * from dba_objects where object_id is not null;alter table t1 modify OBJECT_ID not null;drop table t2 purge;create table t2 as select * from dba_objects where object_id is not null;alter t…