标签: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 }
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 }
欧拉函数:
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 }
标签:amp getc 最大 push can stream break 线性 string
原文地址:http://www.cnblogs.com/mika-mika/p/6925132.html