码迷,mamicode.com
首页 > 其他好文 > 详细

mika的模板库

时间:2017-05-31 19:10:46      阅读:287      评论:0      收藏:0      [点我收藏+]

标签:amp   getc   最大   push   can   stream   break   线性   string   

二分图最大匹配:

1.匈牙利算法:注意dfs中是dfs(c[w[i]]),搜索的是与之匹配的点。

技术分享
 1 #include<cstdio>
 2 #include<cstring>
 3 
 4 int n,m,x,y,fi[100001],w[200001],ne[200001],cnt,c[100001],ans;
 5 bool b[100001];
 6 
 7 void add(int u,int v)
 8 {
 9     w[++cnt]=v;ne[cnt]=fi[u];fi[u]=cnt;
10 }
11 
12 bool dfs(int u)
13 {
14     for(int i=fi[u];i;i=ne[i])
15       if(!b[w[i]])
16       {
17         b[w[i]]=1;
18         if(!c[w[i]] || dfs(c[w[i]]))
19         {
20             c[w[i]]=u;return 1;
21         }
22       }
23     return 0;
24 }
25 
26 int main()
27 {
28     while(scanf("%d",&n)!=EOF)
29     {
30         scanf("%d",&m);cnt=0;
31         memset(fi,0,sizeof(fi));
32         memset(c,0,sizeof(c));
33         for(int i=1;i<=m;i++) scanf("%d%d",&x,&y),add(x,y);
34         for(int i=1;i<=n;i++)
35         {
36             memset(b,0,sizeof(b));
37             if(dfs(i)) ans++;
38         }
39         printf("%d\n",ans);
40     }
41     return 0;
42 }
匈牙利算法
2.dinic算法:速度优于匈牙利算法,但是加边时需要区分两边的点。
技术分享
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<queue>
 5 using namespace std;
 6 
 7 int n,m,x,y,fi[200005],w[400005],ne[400005],v[400005],cnt,ans,dis[200005];
 8 
 9 queue<int> q;
10 
11 int read()
12 {
13     int x=0,f=1;char ch=getchar();
14     while(ch<0 || ch>9) {if(ch==-) f=-1;ch=getchar();}
15     while(ch>=0 && ch<=9) {x=(x<<1)+(x<<3)+ch-0;ch=getchar();}
16     return x*f;
17 }
18 
19 void add(int u,int vv,int val)
20 {
21     w[++cnt]=vv;ne[cnt]=fi[u];fi[u]=cnt;v[cnt]=val;
22     w[++cnt]=u;ne[cnt]=fi[vv];fi[vv]=cnt;v[cnt]=val;
23 }
24 
25 bool bfs()
26 {
27     memset(dis,-1,sizeof(dis));
28     dis[0]=0;q.push(0);
29     while(!q.empty())
30     {
31         int k=q.front();q.pop();
32         for(int i=fi[k];i;i=ne[i])
33           if(v[i]>0 && dis[w[i]]==-1)
34           {
35               dis[w[i]]=dis[k]+1;
36               q.push(w[i]);
37           }
38     }
39     return dis[n*2+1]==-1 ? 0:1;
40 }
41 
42 int dfs(int u,int vv)
43 {
44     if(u==n*2+1) return vv;
45     int kkz,now=0;
46     for(int i=fi[u];i;i=ne[i])
47       if(dis[w[i]]==dis[u]+1 && v[i]>0 && (kkz=dfs(w[i],min(vv-now,v[i]))))
48       {
49         v[i]-=kkz;v[i^1]+=kkz;now+=kkz;
50         if(now==vv) return now;
51       }
52     if(!now) dis[u]=-1;
53     return now;
54 }
55 
56 int main()
57 {
58     while(scanf("%d",&n)!=EOF)
59     {
60         m=read();cnt=1;ans=0;
61         memset(fi,0,sizeof(fi));
62         for(int i=1;i<=m;i++) x=read(),y=read(),add(x,y+n,1);
63         for(int i=1;i<=n;i++) add(0,i,1),add(i+n,2*n+1,1);
64         while(bfs()) ans+=dfs(0,999999999);
65         printf("%d\n",ans);
66     }
67     return 0;
68 }
dinic算法

 

欧拉函数:

1.公式:euler(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…(1-1/pn),其中p1,p2……pn为x的所有素因数,x是不为0的整数。

技术分享
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 using namespace std;
 5 
 6 int n,ans;
 7 
 8 int main()
 9 {
10     scanf("%d",&n);ans=n;
11     for(int i=2;i*i<=n;i++)
12       if(!(n%i))
13       {
14         n/=i;ans=ans/i*(i-1);  
15       }
16     if(n!=1) ans=ans/n*(n-1);
17     printf("%d\n",ans);
18     return 0;
19 }
公式

2.线性筛:

技术分享
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 using namespace std;
 5 
 6 int n,a[10001],phi[10001];
 7 bool b[10001];
 8 
 9 int main()
10 {
11     scanf("%d",&n);phi[1]=1;
12     for(int i=2;i<=n;i++)
13     {
14         if(!b[i]) a[++a[0]]=i,phi[i]=i-1;
15         for(int j=1;a[j]*i<=n && j<=a[0];j++)
16         {
17             b[i*a[j]]=1;
18             if(!(i%a[j]))
19             {
20                 phi[i*a[j]]=phi[i]*a[j];break;
21             }
22             phi[i*a[j]]=phi[i]*phi[a[j]];
23         }
24     }
25     for(int i=1;i<=n;i++) printf("%d ",phi[i]);
26     return 0;
27 }
线性筛

 

mika的模板库

标签:amp   getc   最大   push   can   stream   break   线性   string   

原文地址:http://www.cnblogs.com/mika-mika/p/6925132.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!