memset

memset函数用法

折月煮酒 提交于 2020-01-26 01:53:29
1. memset()函数原型是extern void *memset(void *buffer, int c, int count)   buffer:为指针或是数组   c:是赋给buffer的值 count:是buffer的长度 这个函数在socket中多用于清空数组.如:原型是memset(buffer, 0, sizeof(buffer)), Memset 用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘/0’; 例:char a[100];memset(a, '/0', sizeof(a)); memset可以方便的清空一个结构类型的变量或数组。 如: struct sample_struct {   char csName[16];   int iSeq;   int iType; }; 对于变量:struct sample_struct stTest; 一般情况下,清空stTest的方法: stTest.csName[0]='/0'; stTest.iSeq=0; stTest.iType=0; 用memset就非常方便: memset(&stTest,0,sizeof(struct sample_struct)); 如果是数组: struct sample_struct TEST[10]; 则 memset(TEST,0

01背包

亡梦爱人 提交于 2020-01-25 08:40:49
Charm Bracelet http://poj.org/problem?id=3624 01背包模板题带空间复杂度优化的。 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define mt(a,b) memset(a,b,sizeof(a)) 5 using namespace std; 6 const int M=20010; 7 int n,v,dp[M],c[M],w[M]; 8 void ZeroOnePack(int cost,int weight){ 9 for(int i=v;i>=cost;i--){ 10 dp[i]=max(dp[i],dp[i-cost]+weight); 11 } 12 } 13 int main(){ 14 while(~scanf("%d%d",&n,&v)){ 15 for(int i=1;i<=n;i++){ 16 scanf("%d%d",&c[i],&w[i]); 17 } 18 mt(dp,0); 19 for(int i=1;i<=n;i++){ 20 ZeroOnePack(c[i],w[i]); 21 } 22 printf("%d\n",dp[v]); 23 } 24 return 0; 25 } View Code 饭卡 http:/

Tarjan算法专练

左心房为你撑大大i 提交于 2020-01-24 16:46:32
1. 迷宫城堡 题意:给一个图判断是否是强连通图。 题解:利用Tarjan计算图中强连通分量的个数,如果为1则是强连通图,否则不是。 #include<bits/stdc++.h> using namespace std; const int N = 2e4+100; typedef long long ll; vector<int> G[N]; bool is_instack[N]; int dfn[N],low[N]; stack<int> sta; int n,m,index,scc; void init(){ index=scc=0; memset(dfn,0,sizeof(dfn)); memset(low,0,sizeof(low)); memset(is_instack,0,sizeof(is_instack)); while(!sta.empty()) sta.pop(); for(int i=1;i<=n;i++) G[i].clear(); } void Tarjan(int u){ dfn[u]=low[u]=++index; sta.push(u);is_instack[u]=1; for(auto v:G[u]){ if(!dfn[v]){ Tarjan(v); low[u]=min(low[u],low[v]); } else if(is_instack

memset()函数用法及其作用

人盡茶涼 提交于 2020-01-24 15:29:10
memset()函数原型是: extern void *memset(void *buffer, int c, int count) //buffer:为指针或是数组, //c:是赋给buffer的值, //count:是buffer的长度. 这个函数在socket中多用于清空数组.如:原型是: memset(buffer, 0, sizeof(buffer)) 2.memset 用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘\0’; char a[100]; memset(a, '\0', sizeof(a)); 3.memset可以方便的清空一个结构类型的变量或数组,如: struct sample_struct { char csName[16]; int iSeq; int iType; }; 对于变量: struct sample_strcut stTest; 一般情况下,清空stTest的方法: stTest.csName[0]='/0'; stTest.iSeq=0; stTest.iType=0; 用memset就非常方便: memset(&stTest,0,sizeof(struct sample_struct)); 如果是数组: struct sample_struct TEST[10]; // 则用 memset(TEST

poj 1469 COURSES

亡梦爱人 提交于 2020-01-24 14:14:09
一、二分图的基本概念 【二分图】 二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。 也就是说,只要两个点之间有边,那么这两个点就不能同属一个集合,必须分在两边。 这就带来一个问题,并不是所有的无向图G都能转化为二分图。 【二分图的判定】 定理:无向图G为二分图的充要条件是,G至少有两个顶点,且其所有回路的长度均为偶数。 判定方法:根据定义比根据定理更好判定,只需要从第一个点出发,将其染成颜色1,则与其所有相连的所有终点都染成颜色2,如果与其相连的点已经被染成颜色1,则图G不是二分图。 把该点的所有终点当成新的起点,重复以上过程。很显然,既可以用dfs染色,又可以用bfs染色。 dfs染色代码: #include<iostream> #include<vector> #include<cstring> using namespace std; const int maxn = 10010; int n,m;//顶点数 边数 vector<int> G[maxn]; int color[maxn] ; //0 没染色 1 -1不同色 bool dfs(int u, int c){

HDU2196 -Computer(树形DP)

痴心易碎 提交于 2020-01-23 22:02:08
题意: 给一棵树,求出每一点到树上其他点的最远距离 思路: ①我们先考虑一个点到其子树中的点的最远距离 定义1.dp[i][0]是以i号节点为跟到其子树的最远距离   2.dp[i][1]是以i号节点为跟到其子树的次远距离(为什么维护这个后面可以知道)   3.son[i]是以i号节点为根的的子树中距离i最远的儿子的编号 这样可以通过第一次dfs来的到 ②现在再来考虑最远距离要通过其父亲 定义1.dp[i][2]为通过i的父亲能到达的最远距离 如果i的父亲fa到其子树的最远路径中包含w(fa,i),那么 dp[i][2]=max(dp[fa][1]+w,dp[fa][2]+w) 否则就为: dp[i][2]=max(dp[fa][0]+w,dp[fa][2]+w) 最后,每个点的最远距离就为max(dp[i][0],dp[i][2]) #include<iostream> #include<algorithm> #include<cstring> #include<vector> using namespace std; typedef long long ll; const int maxn=30005; ll dp[maxn][3],son[maxn],tot; int head[maxn],ver[maxn],nxt[maxn],edge[maxn]; void add

AC自动机

馋奶兔 提交于 2020-01-23 19:32:13
题源: https://www.luogu.com.cn/problem/P3796 debug了一下午发现代码又抄错了,数组大小也开错了,数据范围搞混了。。 #include <iostream> #include <stdio.h> #include <cstring> #include <queue> //#define LOCAL //#define fre #define maxn 1000005 using namespace std; char s[maxn], p[155][75]; int n; int nex[10510][26], fail[10510], e[10510], last[10510], ans[155]; //一开始这里开成了75.。。 struct Tire { int cnt; void init() { cnt = 1; memset(nex, 0xff, sizeof(nex)); memset(e, 0, sizeof(e)); memset(last, 0, sizeof(last)); } void insert(char s[], int t) { int len = strlen(s); int now = 0; for (int i = 0; i < len; ++i) { if (nex[now][s[i] - 'a']

memset函数使用详解

时间秒杀一切 提交于 2020-01-22 22:30:47
今天做题卡在MEMSET函数的使用上了,本来以为int a[100]; memset(a, MAX,sizeof(a));就是将a数组全部赋值为MAX,现在才知道他的填充是以字节为单位,一般用于对字符型变量的初值进行赋值. 更详细的解说见百度百科 --> http://baike.baidu.com/view/982208.htm 1。void *memset(void *s,int c,size_t n) 总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c。 2。例子 #include void main(){ char *s="Golden Global View"; clrscr(); memset(s,'G',6); printf("%s",s); getchar(); return 0; }  3。memset() 函数常用于内存空间初始化。如: char str[100]; memset(str,0,100); 4。memset()的深刻内涵:用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘/0’;例:char a[100];memset(a, '/0', sizeof(a)); memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度;例:char a[100],b[50]; memcpy(b,

「网络流 24 题」魔术球

假如想象 提交于 2020-01-22 01:29:01
比较有意思的题 题意:给你n个柱子,问你可以在上面放多少个编号连续且每根柱子上相邻的编号为平方数的球 洗澡时候想的,根据平方数这个关系建边,然后枚举多少个柱子,然后再在图上跑最小路径覆盖,若路径条数大于柱子数,那么珠子数-1就是答案 我写的有点....t了,但不想改 #include<bits/stdc++.h> using namespace std; int n,tot=-1,h[3005],ans=0,hou[3005]; struct node{ int from,next,to,rest,full; int last; }e[1000005]; bool judge[60005]; void add(int x,int y,int z){ tot++; e[tot].next=h[x]; h[x]=tot; e[tot].from=x; e[tot].to=y; e[tot].rest=z; e[tot].full=z; } int dis[3005],g[3005],flow[3005]; bool vis[3005]; int bfs(int s,int t){ queue<int>q; dis[s]=0; q.push(s);vis[s]=true; while(!q.empty()){ int u=q.front();vis[u]=false;q.pop();

「网络流 24 题」试题库

╄→尐↘猪︶ㄣ 提交于 2020-01-22 01:26:51
#include<bits/stdc++.h> using namespace std; int k,n; int tot=-1,h[3005],ans=0,sum=0; struct node{ int from,next,to,rest,full; }e[100005]; void add(int x,int y,int z){ tot++; e[tot].next=h[x]; h[x]=tot; e[tot].from=x; e[tot].to=y; e[tot].rest=z; e[tot].full=z; } int dis[3005],g[3005],flow[3005]; bool vis[3005]; int bfs(int s,int t){ queue<int>q; dis[s]=0; q.push(s);vis[s]=true; while(!q.empty()){ int u=q.front();vis[u]=false;q.pop(); for(int i=h[u];i!=(-1);i=e[i].next){ if(dis[e[i].to]>dis[u]+1&&g[e[i].to]==(-1)&&e[i].rest>0){ g[e[i].to]=i; flow[e[i].to]=min(flow[u],e[i].rest); dis[e[i].to]