网络流24题

网络流24题


说在前边

  1. 一直没有完整的刷过这套题,打算最近一点点刷掉
  2. 通过《最小割模型在信息学竞赛中的应用》及《浅析一类最小割问题》学习常规建图技巧

飞行员配对方案问题

二分图最大匹配

#include <bits/stdc++.h>
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int M = 100005;
const int N = 202;
using namespace std;
int m,n;
struct edge{int e,nxt,w;}E[M<<1];
int h[N],cc;
void add(int u,int v,int w) {E[cc].e=v;E[cc].w=w;E[cc].nxt=h[u];h[u]=cc;++cc;E[cc].e=u;E[cc].w=0;E[cc].nxt=h[v];h[v]=cc;++cc;
}
int d[N],q[M],st,ed;
int bfs() {int l=0,r=0;for(int i=1;i<=n+2;++i) d[i]=0;q[r]=st;++r;d[st]=1;while(l<r) {int u=q[l];++l;for(int i=h[u];~i;i=E[i].nxt) {int v=E[i].e;if(!d[v]&&E[i].w) {d[v]=d[u]+1;q[r]=v;++r;if(v==ed)return 1;}}}return 0;
}
int dfs(int u,int fl) {if(u==ed)return fl;int s=fl,t;for(int i=h[u];~i;i=E[i].nxt) {int v=E[i].e;if(d[v]==d[u]+1&&E[i].w&&s) {t=dfs(v,min(E[i].w,s));s-=t;E[i].w-=t;E[i^1].w+=t;if(s==0)return fl;}}if(s==fl) d[u]=0;return fl-s;
}
int dinic() {int ans=0;while(bfs())ans+=dfs(st,inf);return ans;
}
int main() {scanf("%d%d",&m,&n);for(int i=1;i<=n+2;++i) h[i]=-1;st=n+1;ed=n+2;int u,v;while(scanf("%d%d",&u,&v)!=EOF) {if(u==-1&&v==-1)break;add(u,v,1);}for(int i=1;i<=m;++i) add(st,i,1);for(int i=m+1;i<=n;++i) add(i,ed,1);printf("%d\n",dinic());int f=0;for(int i=1;i<=m;++i) {for(int j=h[i];~j;j=E[j].nxt) {if(E[j].w==0&&E[j].e<=n)printf("%d %d\n",i,E[j].e),f=1;}}if(!f) puts("No Solution!");return 0;
}

太空飞行计划问题

最大权闭合子图,正点权连源,负点权连汇,点权的绝对值作为边权。原本图中的边容量为无穷。割集将图的源汇分开,与源点相通的点就是最大权闭合子图的点集。

#include <bits/stdc++.h>
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int M = 100005;
const int N = 500;
using namespace std;
int m,n;
struct edge{int e,nxt,w;}E[M<<1];
int h[N],cc;
void add(int u,int v,int w) {E[cc].e=v;E[cc].w=w;E[cc].nxt=h[u];h[u]=cc;++cc;E[cc].e=u;E[cc].w=0;E[cc].nxt=h[v];h[v]=cc;++cc;
}
int d[N],q[M],st,ed;
int bfs() {int l=0,r=0;for(int i=1;i<=n+m+2;++i) d[i]=0;q[r]=st;++r;d[st]=1;while(l<r) {int u=q[l];++l;for(int i=h[u];~i;i=E[i].nxt) {int v=E[i].e;if(!d[v]&&E[i].w) {d[v]=d[u]+1;q[r]=v;++r;if(v==ed)return 1;}}}return 0;
}
int dfs(int u,int fl) {if(u==ed)return fl;int s=fl,t;for(int i=h[u];~i;i=E[i].nxt) {int v=E[i].e;if(d[v]==d[u]+1&&E[i].w&&s) {t=dfs(v,min(E[i].w,s));s-=t;E[i].w-=t;E[i^1].w+=t;if(s==0)return fl;}}if(s==fl) d[u]=0;return fl-s;
}
int dinic() {int ans=0;while(bfs())ans+=dfs(st,inf);return ans;
}
vector<int> v,v1,v2;
int vis[N];
void dfs2(int u) {vis[u]=1;if(u>=1&&u<=m)v1.push_back(u);if(u>m&&u<=n+m) v2.push_back(u-m);for(int i=h[u];~i;i=E[i].nxt) {int v=E[i].e;if(!vis[v]&&E[i].w>0)dfs2(v);}
}
int a[N],b[N];
int main() {scanf(" %d %d ",&m,&n);memset(h,-1,sizeof(h));st=m+n+1;ed=st+1;int ans = 0;for(int i=1;i<=m;++i) {string s;v.clear();getline(cin,s);int c=0;while(1){int tmp = 0;while(s[c]>='0'&&s[c]<='9'&&c<s.size()) tmp=tmp*10+s[c]-'0',++c;v.push_back(tmp);if(c==s.size()) break;while(s[c]<'0'||s[c]>'9'&&c<s.size()) ++c;}add(st,i,v[0]);ans+=v[0];a[i]=v[0];for(int j=1;j<v.size();++j) {add(i,v[j]+m,inf);}}for(int i=1;i<=n;++i) {int x;scanf("%d",&x);b[i]=x;add(i+m,ed,x);}ans-=dinic();dfs2(st);int t=0;for(auto x: v1)printf("%d ",x),t+=a[x];puts("");for(auto x: v2)printf("%d ",x),t-=b[x];puts("");printf("%d\n",ans);return 0;
}

最小路径覆盖问题

DAG最小路径覆盖,拆点二分图最大匹配。分析见这里

#include <bits/stdc++.h>
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int M = 1000005;
const int N = 1500;
using namespace std;
int m,n;
struct edge{int e,nxt,w;}E[M<<1];
int h[N],cc;
void add(int u,int v,int w) {E[cc].e=v;E[cc].w=w;E[cc].nxt=h[u];h[u]=cc;++cc;E[cc].e=u;E[cc].w=0;E[cc].nxt=h[v];h[v]=cc;++cc;
}
int d[N],q[M],st,ed;
int bfs() {int l=0,r=0;for(int i=1;i<=n+n+2;++i) d[i]=0;q[r]=st;++r;d[st]=1;while(l<r) {int u=q[l];++l;for(int i=h[u];~i;i=E[i].nxt) {int v=E[i].e;if(!d[v]&&E[i].w) {d[v]=d[u]+1;q[r]=v;++r;if(v==ed)return 1;}}}return 0;
}
int dfs(int u,int fl) {if(u==ed)return fl;int s=fl,t;for(int i=h[u];~i;i=E[i].nxt) {int v=E[i].e;if(d[v]==d[u]+1&&E[i].w&&s) {t=dfs(v,min(E[i].w,s));s-=t;E[i].w-=t;E[i^1].w+=t;if(s==0)return fl;}}if(s==fl) d[u]=0;return fl-s;
}
int dinic() {int ans=0;while(bfs())ans+=dfs(st,inf);return ans;
}
int vis[N],in[N];
vector<int> G[N];
void dfs2(int u) {vis[u]=1;printf("%d ",u);for(int i=h[u];~i;i=E[i].nxt) {int v=E[i].e;if(v>n&&v<=2*n&&!vis[v-n])--in[v-n];}for(int i=h[u];~i;i=E[i].nxt)if(!E[i].w){int v=E[i].e;if(v>n&&v<=2*n&&!vis[v-n])dfs2(v-n);}
}int main() {scanf(" %d %d ",&n,&m);memset(h,-1,sizeof(h));st = 2*n+1; ed = st+1;for(int i=1;i<=n;++i) add(st,i,1);for(int i=1;i<=n;++i) add(i+n,ed,1);for(int i=1;i<=m;++i) {int x,y;scanf("%d%d",&x,&y);add(x,y+n,1);++in[y];}int ans = n - dinic();for(int i=1;i<=n;++i)if(!in[i]&&!vis[i]) {dfs2(i);puts("");}printf("%d\n",ans);return 0;
}

魔术球问题

每根柱子看作是一条链,那么就是用最少的链把所有点都覆盖掉,及最小路径覆盖。在dinic跑的同时,加入新的点,直到超过n条链结束。其余同上题。


#include <bits/stdc++.h>
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int M = 1000005;
const int lim = 5000;
using namespace std;
int m,n;
struct edge{int e,nxt,w;}E[M<<2];
int h[lim<<2],cc;
void add(int u,int v,int w) {E[cc].e=v;E[cc].w=w;E[cc].nxt=h[u];h[u]=cc;++cc;E[cc].e=u;E[cc].w=0;E[cc].nxt=h[v];h[v]=cc;++cc;
}
int d[lim<<2],q[M],st,ed;
int bfs() {int l=0,r=0;memset(d,0,sizeof(d));q[r]=st;++r;d[st]=1;while(l<r) {int u=q[l];++l;for(int i=h[u];~i;i=E[i].nxt) {int v=E[i].e;if(!d[v]&&E[i].w) {d[v]=d[u]+1;q[r]=v;++r;if(v==ed)return 1;}}}return 0;
}
int dfs(int u,int fl) {if(u==ed)return fl;int s=fl,t;for(int i=h[u];~i;i=E[i].nxt) {int v=E[i].e;if(d[v]==d[u]+1&&E[i].w&&s) {t=dfs(v,min(E[i].w,s));s-=t;E[i].w-=t;E[i^1].w+=t;if(s==0)return fl;}}if(s==fl) d[u]=0;return fl-s;
}int vis[lim<<2],in[lim<<2];void dfs2(int u,int cnt) {vis[u]=1;printf("%d ",u);for(int i=h[u];~i;i=E[i].nxt) {int v=E[i].e;if(v<cnt+lim&&v>lim&&!vis[v-n])--in[v-n];}for(int i=h[u];~i;i=E[i].nxt)if(!E[i].w){int v=E[i].e;if(v<cnt+lim&&v>lim&&!vis[v-lim])dfs2(v-lim,cnt);}
}
int is2[M];
int main() {scanf("%d",&n);for(int i=1;i*i<=100000;++i)is2[i*i]=1;memset(h,-1,sizeof(h));int cnt=0;st = lim*2+2; ed  = lim*2+3;int ans=0;for(int i=1;i<=lim;++i) add(st,i,1);for(int i=1;i<=lim;++i) add(i+lim,ed,1);while(1){++cnt;for(int i=1;i<cnt;++i)if(is2[i+cnt]){add(i,cnt+lim,1);++in[cnt];}while(bfs())ans+=dfs(st,inf);int tmp = cnt - ans;if(tmp==n+1)break;}printf("%d\n",cnt-1);for(int i=1;i<cnt;++i)if(!vis[i]) {dfs2(i,cnt);puts("");}return 0;
}

圆桌问题

二分图多重匹配,(总点数在变化。。。贴板子WA了几发

#include <bits/stdc++.h>
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int M = 1000005;
const int N = 500;
using namespace std;
int m,n;
struct edge{int e,nxt,w;}E[M<<1];
int h[N],cc;
void add(int u,int v,int w) {E[cc].e=v;E[cc].w=w;E[cc].nxt=h[u];h[u]=cc;++cc;E[cc].e=u;E[cc].w=0;E[cc].nxt=h[v];h[v]=cc;++cc;
}
int d[N],q[M],st,ed;
int bfs() {int l=0,r=0;for(int i=1;i<=n+m+2;++i) d[i]=0;q[r]=st;++r;d[st]=1;while(l<r) {int u=q[l];++l;for(int i=h[u];~i;i=E[i].nxt) {int v=E[i].e;if(!d[v]&&E[i].w) {d[v]=d[u]+1;q[r]=v;++r;if(v==ed)return 1;}}}return 0;
}
int dfs(int u,int fl) {if(u==ed)return fl;int s=fl,t;for(int i=h[u];~i;i=E[i].nxt) {int v=E[i].e;if(d[v]==d[u]+1&&E[i].w&&s) {t=dfs(v,min(E[i].w,s));s-=t;E[i].w-=t;E[i^1].w+=t;if(s==0)return fl;}}if(s==fl) d[u]=0;return fl-s;
}
int dinic() {int ans=0;while(bfs())ans+=dfs(st,inf);return ans;
}int a[N],b[N];
int main() {scanf("%d%d",&m,&n);memset(h,-1,sizeof(h));st = m + n +1; ed = st+1;int tmp = 0;for(int i=1;i<=m;++i) {scanf("%d",&a[i]);add(st,i,a[i]);tmp+=a[i];}for(int i=1;i<=n;++i) {scanf("%d",&b[i]);add(i+m,ed,b[i]);}for(int i=1;i<=m;++i)for(int j=1;j<=n;++j) add(i,j+m,1);int ans = dinic();if(ans==tmp) {puts("1");for(int i=1;i<=m;++i) {for(int j=h[i];~j;j=E[j].nxt)if(E[j].e>m&&E[j].e<=n+m&&!E[j].w) printf("%d ",E[j].e-m);puts("");}}else puts("0");return 0;
}

最长递增子序列问题

第一问直接dp即可,第二问,先发现它是在第一问最长上升子序列的基础上做的。一眼的思路就是,我在dp的时候把以每个位置为最大值的,所有的最长上升子序列,最后取出其中的所有最长上升子序列,然后每个序列按顺序从左到右连边,每个点限流为1,然后直接最大流。这样做第二问应该是ok的。但是一开始用vector< vector > 存了所有的序列,可能爆内存吧。第三问用同样的方法,然后把1和n的限流改成了inf,如果他们和源汇相连也改成inf,还没搞清楚为什么会WA。其实不用求出所有序列,只要确定开头和末尾,中间把他们有转移关系的位置连边,限流,再最大流。第三问跟上面操作一样吧。

#include <bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=a;i>=b;--i)
#define pb push_back
const int N = 844;
const int inf = 0x3f3f3f3f;
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
int n, ans1, ans2, ans3;
struct edge{int e,w,nxt;}E[N*N*2];
int cc, h[N];
void add(int u, int v, int w) {E[cc].e=v;E[cc].w=w;E[cc].nxt=h[u];h[u]=cc;++cc;E[cc].e=u;E[cc].w=0;E[cc].nxt=h[v];h[v]=cc;++cc;
}
int st, ed, d[N], q[N*N*2], in[N], out[N];
int bfs() {int l=0,r=0;for(int i=1;i<=2*n+3;++i)d[i]=0;q[r]=st;++r;d[st]=1;while(l < r) {int u = q[l]; ++l;for(int i=h[u];~i;i=E[i].nxt) {int v=E[i].e;if(!d[v]&&E[i].w) {d[v]=d[u]+1;q[r]=v;++r;if(v==ed)return 1;}}}return 0;
}
int dfs(int u, int fl) {if(u==ed) return fl;int s=fl,t;for(int i=h[u];~i;i=E[i].nxt) {int v=E[i].e;if(d[v]==d[u]+1&&E[i].w&&s) {t=dfs(v,min(E[i].w,s));s-=t;E[i].w-=t;E[i^1].w+=t;if(s==0)return fl;}}if(s==fl)d[u]=0;return fl-s;
}
int dinic() {int ans = 0;while(bfs()) ans+=dfs(st,inf);return ans;
}
int a[N], dp[N];
int main() {scanf("%d",&n);rep(i,1,n) scanf("%d",&a[i]);// 1rep(i,1,n)dp[i]=1;rep(i,2,n)rep(j,1,i-1) if(a[j]<a[i])dp[i] = max(dp[i],dp[j]+1);rep(i,1,n) ans1=max(ans1,dp[i]);printf("%d\n",ans1);// 2st=n*2+1; ed=st+1;rep(i,1,ed) h[i]=-1;rep(i,1,n) add(i,i+n,1);rep(i,1,n) if(dp[i] == 1) add(st,i,1);rep(i,1,n) if(dp[i] == ans1) add(i+n,ed,1);rep(i,1,n) rep(j,1,i)if(a[i]>a[j]&&dp[i]==dp[j]+1) add(j+n,i,1);int ans2 = dinic();printf("%d\n",ans2);//3add(1,1+n,inf);add(st,1,inf);add(n,n+n,inf);if(dp[n]==ans1) add(n+n,ed,inf);int ans3 = ans2 + dinic();printf("%d\n",ans3);return 0;
}

转载于:https://www.cnblogs.com/RRRR-wys/p/9326985.html

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

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

相关文章

P3959-宝藏【模拟退火】

正题 题目链接:https://www.luogu.com.cn/problem/P3959 题目大意 nnn个点&#xff0c;mmm条边&#xff0c;求一棵有根生成树权值最小。对于一条边(fa,x,w)(fa,x,w)(fa,x,w)会产生权值depfa∗wdep_{fa}*wdepfa​∗w。 解题思路 我们模拟退火每次随机一个序列&#xff0c;然后…

ASP.NET Core Web API 集成测试中使用 Bearer Token

在 ASP.NET Core Web API 集成测试一文中, 我介绍了ASP.NET Core Web API的集成测试. 在那里我使用了测试专用的Startup类, 里面的配置和开发时有一些区别, 例如里面去掉了用户身份验证相关的中间件.但是有些被测试的行为里面需要用到身份/授权信息.所以本文就介绍一下在API集成…

桐桐的雷达

桐桐的雷达 题目大意&#xff1a; 有一堆数字&#xff0c;并给出一个范围&#xff0c;判断不在范围内的数字是否多过10%&#xff0c;若不多过&#xff0c;那输出范围内数字的平均值 原题&#xff1a; 题目描述 桐桐在去广州的路上&#xff0c;对高速公路上的测速雷达产生了…

Codeforces Round #497 (Div. 1)

Codeforces Round #497 (Div. 1) A. Reorder the Array 先满足数值较小的位置&#xff0c;每次找恰好大于这个值的一个值即可。 #include <bits/stdc.h> #define rep(i,a,b) for(int ia;i<b;i) #define pb push_back typedef long long ll; const int N 100200; usin…

jzoj6824-[2020.10.17提高组模拟]英雄联盟【期望】

正题 题目大意 开始暴击率为xxx&#xff0c;每次失败后都会增加xxx&#xff0c;成功后重置&#xff0c;然后求攻击1010610^{10^6}10106次后的暴击次数除以1010610^{10^6}10106 解题思路 定义ansansans为期望攻击多少次后暴击&#xff0c;然后答案为1ans\frac{1}{ans}ans1​。…

【模拟】桐桐的游戏

桐桐的游戏 题目大意&#xff1a; 有一个用数组成的环要从1跳到z&#xff08;有些点不能跳&#xff09;&#xff0c;每次跳的步数最少有多少步 原题&#xff1a; 题目描述 桐桐最近在玩一个跳棋游戏&#xff0c;规则是&#xff1a;有个圆圈&#xff0c;分成N等分&#xff…

ASP.NET Core 应用发布与部署指南

一、前言本篇主要包含哪些内容&#xff1f;将项目发布到本地目录将项目传输到服务器并配置启动&开机自动启动将Nginx作为访问入口&#xff0c;配置反向代理本篇环境信息开发环境&#xff1a;用途工具&版本操作系统Windows 10开发工具Visual Studio 2017&#xff08;15.…

jzoj6826-[2020.10.17提高组模拟]隔膜【博弈论】

正题 题目大意 n∗nn*nn∗n的矩形&#xff0c;每一个人操作时如果棋盘上有一个k∗kk*kk∗k的矩形空地就可以选择一个点堵上。如果没有就失败了&#xff0c;求必胜方。 解题思路 如果场地上有一个位置堵上后即可堵上所有k∗kk*kk∗k的矩形那么这个点被堵住后就赢了&#xff0c;…

牛客网暑期ACM多校训练营(第一场)

牛客网暑期ACM多校训练营&#xff08;第一场&#xff09; A. Monotonic Matrix 考虑0和1的分界线&#xff0c;1和2的分界线&#xff0c;发现问题可以转化为两条不互相穿过的路径的方案数&#xff08;可重叠&#xff09;&#xff0c;题解的做法就是把一条路径斜着平移&#xff0…

2014 ACM/ICPC Asia Regional Xi'an Online

2014西安网络赛 A. Post Robot 把每种单词都kmp跑一遍&#xff0c;顺序输出即可 #include <cstdio> #include <iostream> #include <algorithm> #include <map> #include <cstring> #include <cmath> #include <queue> #include <…

MongoDB发布4.0版本,支持ACID事务

MongoDB最近发布了最新的4.0版本。毫无疑问&#xff0c;这一版本的主要特性是支持多文档ACID事务。MongoDB向与关系型数据库产品的融合迈出了一大步&#xff0c;现在支持会话的概念&#xff0c;并可以使用start_transaction()和commit_transaction()方法将多个数据库命令包含在…

P5491-[模板]二次剩余

正题 题目链接:https://www.luogu.com.cn/problem/P5491 题目大意 求解x2N(modP)x^2N(mod\ \ P)x2N(mod P) 解题思路 若aaa在模ppp意义下可以开根那么aaa就是ppp的二次剩余&#xff0c;定义 (ap){1(a是p的二次剩余)−1(a是p的二次非剩余)0(p∣a)\binom{a}{p}\left\{\begin{…

【递归】桐桐的递归函数

桐桐的递归函数 题目大意&#xff1a; 有一个函数&#xff0c;让你照着打 原题&#xff1a; 题目描述 桐桐经常找一些很有趣的数学书来阅读以增长自己的数学知识。一天&#xff0c;他偶然发现一个递归函数w&#xff08;a&#xff0c;b&#xff0c;c&#xff09;有以下性质…

分享我编程工作经历及对软件开发前景的看法

本人一直从事互联网行业&#xff0c;熟练C#、javascript,熟悉C\C,JAVA,php,object-c,熟练的开发工具有Visual Studio,数据库是MS SQL SERVER。这两天实在是无聊&#xff0c;回忆一下本人的工作经历&#xff0c;一路走来很辛苦&#xff0c;很坎坷&#xff0c;现在都快40岁了&…

P4026-[SHOI2008]循环的债务【dp】

正题 题目链接:https://www.luogu.com.cn/problem/P4026 题目大意 333个人&#xff0c;有一些面值为100,50,20,10,5,1100,50,20,10,5,1100,50,20,10,5,1的钱&#xff0c;一些人欠一些人钱&#xff0c;求最少交换多少张钞票可以还清。 解题思路 我们设fi,j,kf_{i,j,k}fi,j,k​…

【模拟】桐桐的新闻系统

桐桐的新闻系统 题目大意&#xff1a; 有n个人&#xff0c;每个人有自己的ID和收新闻的间隔&#xff0c;问前k次发送新闻是分别发给谁的 原题&#xff1a; 题目描述 桐桐为期末的电脑作业设计一套新闻系统&#xff0c;他把这套系统称为Argus。 使用这套系统的用户可以向这…

实体类的动态生成(三)

前言在 .NET 中主要有两种动态生成并编译的方式&#xff0c;一种是通过 System.Linq.Expressions 命名空间中的 LambdaExpression 类的 CompileToMethod(...) 方法&#xff0c;但是这种方法只支持动态编译到静态方法&#xff0c;因为这个限制我们只能放弃它而采用 Emitting 生成…

牛客网暑期ACM多校训练营(第三场)

牛客网暑期ACM多校训练营&#xff08;第三场&#xff09; A. PACM Team 01背包&#xff0c;输出方案&#xff0c;用bool存每种状态下用的哪一个物品&#xff0c;卡内存。官方题解上&#xff0c;说用char或者short就行了。还有一种做法是把用的物品压成一个int。 #include <b…

P4096-[HEOI2013]Eden的博弈树

正题 题目链接:https://www.luogu.com.cn/problem/P4096 题目大意 一个博弈树&#xff0c;黑方先手。定义一个最小的叶子节点集为黑胜状态为黑方胜利集合&#xff0c;白色亦然。求所有既属于黑方胜利集合有属于白方胜利集合的点。 解题思路 设fi,0/1f_{i,0/1}fi,0/1​表示ii…

【DP】数字编码

数字编码 题目大意&#xff1a; 有一个序列&#xff0c;可以把它分为一些子序列&#xff0c;但要按题意用字符串表示出来&#xff0c;现在要求字符串的字符最小是多少 原题&#xff1a; 题目描述 一列有顺序的非负整数&#xff0c;需要把它们编码成一个0、10、10、1字符串…