// ** Start of PerfectMatch ******************************* // Name: PerfectMatch by Kuhn_Munkras O(n^3) // Description: w is the adjacency matrix, nx,ny are the size of x and y, // lx, ly are the lables of x and y, fx[i], fy[i] is used for marking // whether the i-th node is visited, matx[x] means x match matx[x], // maty[y] means y match maty[y], actually, matx[x] is useless, // all the arrays are start at 1 int nx,ny,w[MAXN][MAXN],lx[MAXN],ly[MAXN]; int fx[MAXN],fy[MAXN],matx[MAXN],maty[MAXN]; int path(int u) { int v; fx[u]=1; for(v=1;v<=ny;v++) if((lx[u]+ly[v]==w[u][v])&&(fy[v]<0)) { fy[v]=1; if((maty[v]<0)||(path(maty[v]))) { matx[u]=v; maty[v]=u; return(1); } // end of if((maty[v]... } // end of if((lx[u]... return(0); } // end of int path() int PerfectMatch() { int ret=0,i,j,k,p; memset(ly,0,sizeof(ly)); for(i=1;i<=nx;i++) { lx[i]=-INF; for(j=1;j<=ny;j++) if(w[i][j]>lx[i]) lx[i]=w[i][j]; } // end of for(i... memset(matx,-1,sizeof(matx)); memset(maty,-1,sizeof(maty)); for(i=1;i<=nx;i++) { memset(fx,-1,sizeof(fx)); memset(fy,-1,sizeof(fy)); if(!path(i)) { i--; p=INF; for(k=1;k<=nx;k++) if(fx[k]>0) for(j=1;j<=ny;j++) if((fy[j]<0)&&(lx[k]+ly[j]-w[k][j]<p)) p=lx[k]+ly[j]-w[k][j]; for(j=1;j<=ny;j++) ly[j]+=(fy[j]<0?0:p); for(k=1;k<=nx;k++) lx[k]-=(fx[k]<0?0:p); } // end of if(!path(i)) } // end of for(i... for(i=1;i<=ny;i++) ret+=w[maty[i]][i]; return ret; } // end of int PerfectMatch() // ** End of PerfectMatch *********************************
标程
最大匹配(匈牙利算法)
// ** Start of MaximumMatch ******************************* // Name: MaximumMatch by Hungray O(n^3) // Description: mat is the adjacency matrix, nx,ny are the size of x and y, // fy is used for marking whether the k-th node is visited, matx[x] means x // match matx[x], maty[y] means y match maty[y], actually, matx[x] is useless, // all the arrays start at 1 int nx,ny,mat[MAXN][MAXN],fy[MAXN],matx[MAXN],maty[MAXN]; int path(int u) { int v; for(v=1;v<=ny;v++) if((mat[u][v])&&(fy[v]<0)) { fy[v]=1; if((maty[v]<0)||(path(maty[v]))) { matx[u]=v; maty[v]=u; return(1); } // end of if((maty[v]... } // end of if((mat[u][v]... return(0); } // end of int path() int MaximumMatch() { int i,ret=0; memset(matx,-1,sizeof(matx)); memset(maty,-1,sizeof(maty)); for(i=1;i<=nx;i++) if(matx[i]<0) { memset(fy,-1,sizeof(fy)); ret+=path(i); } // end of if(matx[i]... return(ret); } // end of int MaximumMatch() // ** End of MaximumMatch *********************************
KMP
直接抄的武大李春葆老师的数据结构上的改进KMP
// return the first matching string2 in the string1 #include <stdio.h> #include <string.h> #define MaxSize 1000 typedef struct { char ch[MaxSize]; int len; } SqString; void GetNextval(SqString t,int nextval[]) { int j=0,k=-1; nextval[0]=-1; while(j<t.len) { if((k==-1)||(t.ch[j]==t.ch[k])) { j++; k++; if(t.ch[j]!=t.ch[k]) nextval[j]=k; else nextval[j]=nextval[k]; } else k=nextval[k]; } } int KMP(SqString s,SqString t) { int nextval[MaxSize],i=0,j=0,v; GetNextval(t,nextval); while((i<s.len)&&(j<t.len)) { if((j==-1)||(s.ch[i]==t.ch[j])) { i++; j++; } else j=nextval[j]; } if(j>=t.len) v=i-t.len; else v=-1; return(v); } int main() { // freopen("kmp.in","r",stdin); // freopen("kmp.out","w",stdout); SqString str1,str2; gets(str1.ch); str1.len=strlen(str1.ch); gets(str2.ch); str2.len=strlen(str2.ch); printf("%dn",KMP(str1,str2)); return(0); }
RMQ
从whummd的blog上copy来的,加了点自己的修改,正在看,集训加油
// StandCode for RMQ, return the smallest number in array s[i..j] #include <iostream> #include <cmath> using namespace std; #define MAXN 1000000 int f2[30]; int s[MAXN]; int r[MAXN][22]; void make_f2(int n) { int i; for(i=0;i<=n;i++) f2[i]=1<<i; return; } void make_RMQ(int n) { int i,j; for(i=1;i<=n;i++) r[i][0]=s[i]; for(j=1;j<=log(n)/log(2);j++) for(i=1;i<=n;i++) r[i][j]=min(r[i][j-1],r[i+f2[j-1]][j-1]); return; } int RMQ(int i,int j) { int k=int(log(j-i+1)/log(2)); return(min(r[i][k],r[j-f2[k]+1][k])); } int main() { freopen("rmp.in","r",stdin); freopen("rmp.out","w",stdout); int n,i,start,end; scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",&s[i]); make_f2(20); make_RMQ(n); while(scanf("%d%d",&start,&end)!=EOF) printf("%dn",RMQ(start,end)); return 0; }