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 }
Floyd
 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 //堆优化暂时不会?
Dijkstra
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
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     }
SPFA

 

  • 最小环

 

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 }
快速幂

 

posted @ 2017-08-13 17:03  Yuns's  阅读(777)  评论(0)    收藏  举报