OI模板合集
写在前面:
集合了一些OI的数据结构/图论/字符串/数论等代码,按学习进度更新,个人代码较丑请谅解(:溜
pu??突然发现自己的帖子被人挂在知乎了
看来得更新了??
-
读入优化
1 int Read() { 2 3 int val = 0, opt = 1; 4 char ch; 5 while (!(isdigit( ch = getchar() ) || ch == '-')); 6 if (ch == '-') opt =-1; 7 else val = ch - '0'; 8 while (isdigit( ch = getchar() )) (val *= 10) += ch - '0'; 9 return val * opt; 10 11 }
图论
-
最短路
1 //Floyd 2 int Floyd() 3 { 4 for (int i = 1;i <= n;i++) 5 for (int j = 1;j <= n;j++) 6 for (int k = 1;k <= n;k++) 7 Way[j][k] = min(Way[j][k] , Way[j][i] + Way[i][k]); 8 }
1 int Dijkstra() 2 { 3 for(i=1;i<=n;i++) 4 dis[i]=e[1][i]; 5 6 for(i=1;i<=n;i++) 7 book[i]=0; 8 book[1]=1; 9 10 for(i=1;i<=n-1;i++) 11 { 12 min=inf; 13 for(j=1;j<=n;j++) 14 { 15 if(book[j]==0 && dis[j]<min) 16 { 17 min=dis[j]; 18 u=j; 19 } 20 } 21 book[u]=1; 22 for(v=1;v<=n;v++) 23 { 24 if(e[u][v]<inf) 25 { 26 if(dis[v]>dis[u]+e[u][v]) 27 dis[v]=dis[u]+e[u][v]; 28 } 29 } 30 } 31 } 32 //堆优化暂时不会?
1 int Bellman-Ford() 2 { 3 for (int k = 1;k < n;++k) 4 for (int i = 1;i <= m;++i) 5 dis[v[i]] = min(dis[v[i]] , dis[u[i]]+w[i]); 6 }//Bellman-Ford
1 while(!que.empty()){ 2 int x = que.front(); 3 que.pop(); 4 book[x] = 0; 5 for (int i = 1;i <= n;i++){ 6 if (dis[i] > dis[x]+Map[x][i]){ 7 dis[i] = dis[x]+Map[x][i]; 8 if (!book[i]){ 9 book[i] = 1; 10 que.push(i); 11 } 12 } 13 } 14 }
-
最小环
Floyd求最小环
-
二分图匹配
1 //匈牙利算法 2 int Match(int x){ 3 for (int i = 1;i <= n;i++){ 4 if (!Book[i] && Ques[x][i]){ 5 Book[i] = 1; 6 if (!Marry[i] || find(Marry[i])){ 7 Marry[i] = x; 8 Marry[x] = i; 9 return 1; 10 } 11 } 12 } 13 return 0; 14 }
-
线段树
1 //区间最小值线段树 2 void Build(int jd , int l , int r){ 3 if (l == r) 4 Tree[jd] = Book[l]; 5 else{ 6 Build(jd*2,l,(l+r)/2); 7 Build(jd*2+1,(l+r)/2+1,r); 8 9 Tree[jd] = min(Tree[jd*2] , Tree[jd*2+1]); 10 } 11 return; 12 } //建树 13 14 int Find(int jd , int l , int r , int begin , int end){ 15 if (begin > r || end < l) 16 return -1; 17 18 if (l >= begin && r <= end) 19 return Tree[jd]; 20 21 int a = Find(jd*2 , l , (l+r)/2 , begin , end); 22 int b = Find(jd*2+1 , (l+r)/2+1 , r , begin , end); 23 24 if (a == -1 || b == -1) return max(a , b); 25 else return min(a , b); 26 }//查询区间最小值 27 28 线段树
-
树状数组
1 void add(int x , int y){ 2 while(x <= n){ 3 Ans[x]+=y; 4 x+=lowbit(x); 5 } 6 return; 7 } 8 9 int query(int x){ 10 int Ans_sum = 0; 11 while(x > 0){ 12 Ans_sum+=Ans[x]; 13 x-=lowbit(x); 14 } 15 return Ans_sum; 16 }
-
并查集
int Find(int x){ if (f[x] != x) f[x] = Find(f[(x)]); return f[x]; } void Uni(int x , int y){ f[Find(x)] = f[Find(y)]; return; }
数论
-
最大公约数
1 int Gcd(int x , int y){ 2 return y ? Gcd(y , x % y) : x; 3 }
-
快速幂
1 LL Mod_Pow(LL X , LL N){ 2 3 LL Res = 1; 4 while(N > 0){ 5 6 if (N & 1) Res = Res * X % Mod; 7 X = X * X % Mod; 8 N >>= 1; 9 } 10 11 return Res; 12 }
工欲善其事 必先利其器

浙公网安备 33010602011771号