并查集void UFset( ) //初始化{for( int i=0; i<N; i++ )parent[i] = -1;}int Find( int x ) //查找并返回结点x所属集合的根结点{int s; //查找位置//一直查找到parent[s]为负数(此时的s即为根结点)为止for( s=x; parent[s]>=0; s=parent[s] );while( s!=x ) //优化方案―压缩路径,使后续的查找操作加速{int tmp = parent[x];parent[x] = s;x = tmp;}return s;}//R1和R2是两个元素,属于两个不同的集合,现在合并这两个集合void Union( int R1, int R2 ){//r1为R1的根结点,r2为R2的根结点int r1 = Find(R1), r2 = Find(R2);int tmp = parent[r1] + parent[r2]; //两个集合结点个数之和(负数)//如果R2所在树结点个数> R1所在树结点个数//注意parent[r1]和parent[r2]都是负数if( parent[r1] > parent[r2] ) //优化方案――加权法则{parent[r1] = r2; //将根结点r1所在的树作为r2的子树(合并)parent[r2] = tmp; //更新根结点r2的parent[ ]值}else{parent[r2] = r1; //将根结点r2所在的树作为r1的子树(合并)parent[r1] = tmp; //更新根结点r1的parent[ ]值}}字符串的kmp算法:#include<iostream>#include<ctime>#include<fstream>#include<cstdio>#include<cmath>#include<cstring>using namespace std;//ifstream fin("g.txt");//ofstream fout("g.out");char s[1000];char p[1000];int next[1000];int n,m;//长度void next_val(){int i,j;j=-1;i=0;next[0]=-1;while(i<m-1){if(j==-1||p[i]==p[j]){i++;j++;if(p[i]!=p[j])next[i]=j;elsenext[i]=next[j];}elsej=next[j];}}int index(){int i, j;i=0;j=-1;while(i<n&&j<m){if(j==-1||p[j]==s[i]){i++;j++;}elsej=next[j];}if(j>m-1) return i-m+1;elsereturn 0;}int main(){freopen("g.txt","r",stdin);int i;cin>>n;cin>>s;//主串cin>>m;cin>>p;//模式串next_val();for(i=0 ;i<m ;i++){cout<<next[i]+1;}cout<<endl;cout<<index()<<endl;return 0;}高斯消元解线性方程组double m[100][100];double b[100];double x[100];int n;int main(){cin>>n;int i,j,k;for(i=1; i<=n; i++){for(j=1; j<=n; j++)cin>>m[i][j];cin>>b[i];}for(i=1; i<n; i++)//消元{if(m[i][i]==0)//判断是否为0,为就更最近一行(不为0换){for(j=i+1; j<=n; j++)if(m[j][i]!=0){for(k=1; k<=n; k++){double t=m[i][k];m[i][k]=m[j][k];m[j][k]=t;}double t;t=b[i];b[i]=b[j];b[j]=t;}}if(m[i][i]==0) continue;都为0 就下也回合,for(k=i+1; k<=n; k++){if(m[k][i]==0)continue;for(j=i+1 ; j<=n; j++){m[k][j]-=(m[i][j]/m[i][i])*m[k][i];}b[k]-=(b[i]/m[i][i])*m[k][i];m[k][i]=0;}}//回带过程if(m[n][n]!=0)x[n]=b[n]/m[n][n];else if(b[n]==0)x[n]=0;else{cout<<"NO Solution!"<<endl;return 0;}for(i=n-1; i>=1; i--){for(j=n; j>i; j--){x[i]-=x[j]*m[i][j];}if(m[i][i]!=0)x[i]=(x[i]+b[i])/m[i][i];else if((b[i]+x[i])!=0){cout<<"NO Solution!"<<endl;return 0;}}for(i=1; i<=n; i++)cout<<x[i]<<" ";cout<<endl;return 0;}计算几何:#include<iostream>#include<algorithm>#include<iomanip>#include<cstdio>#include<cmath>#include<ctime>#define Abs(x) (((x)<0)?(-(x)):(x))#define Max(a,b) (((a)>(b))?(a):(b))#define Min(a,b) ((a)<(b))?(a):(b)))#define Epsilon 1e-10#define infinity 1e+10#define PI 3.14159265358979323846using namespace std;struct POINT{double x;double y;POINT():x(0),y(0){};POINT(double _x, double _y):x(_x),y(_y){}; };struct LINE{double a,b,c;POINT A;POINT B;LINE() {};LINE( POINT _a, POINT _b){A=_a;B=_b;a=B.y-A.y;b=A.x-B.x;c=B.x*A.y-A.x*B.y;};};struct RECT{POINT a;POINT b;RECT() {};RECT ( POINT _a, POINT _b):a(_a),b(_b){};};struct SEG{POINT a;POINT b;SEG() {};SEG(POINT _a, POINT _b):a(_a), b(_b) {};};struct TRIANGLE{POINT a,b,c;TRIANGLE() {};TRIANGLE(POINT _a,POINT _b,POINT _c):a(_a),b(_b),c(_c) {}; };struct CIRCLE{double x;double y;double r;CIRCLE() {};CIRCLE(double _x,double _y,double _r): x(_x), y(_y), r(_r){}; };struct POLY{int n;double *x;double *y;POLY() :n(0),x(NULL), y(NULL){};POLY(int _n, const double *_x, const double *_y){n=_n;x=new double[n+1];memcpy(x,_x,n*sizeof(double));x[n]=_x[n];y=new double[n+1];memcpy(y,_y, n*sizeof(double));y[n]=_y[n];}};double Cross(POINT a,POINT b, POINT o){return (a.x-o.x)*(b.y-o.y)-(b.x-o.x)*(a.y-o.y);}SEG Edge(const POLY & poly, int idx){idx%=poly.n;return SEG(POINT(poly.x[idx],poly.y[idx]),POINT(poly.x[idx+1],poly.y[idx+1]));}bool IsEqual(double a, double b){return (Abs(a-b)<Epsilon);}bool IsEqual(const POINT & a, const POINT & b){return (IsEqual(a.x,b.x)&&IsEqual(a.y,b.y));}void Coefficient(const LINE & L, double &A, double &B, double &C){A=L.a;B=L.b;C=L.c;}void Coefficient(const SEG &AB,double &A, double &B, double &C )线段系数{A=AB.b.y-AB.a.y;B=AB.a.x-AB.b.x;C=AB.b.x*AB.a.y-AB.a.x*AB.b.y;}bool IsEqual(const LINE &A, const LINE &B)判断两直线是否一样{double A1,B1,C1;double A2,B2,C2;Coefficient(A,A1,B1,C1);Coefficient(B,A2,B2,C2);return IsEqual(A1*B2,A2*B1)&&IsEqual(A1*C2,A2*C1)&&IsEqual(B1*C2,B2*C1);}bool IsOnSeg(const SEG & seg, const POINT & p)判断点是否在线段上{if(Cross(seg.a,seg.b,p)!=0) return false;if((p.x>seg.a.x&&p.x>seg.b.x)||(p.x<seg.a.x&&p.x<seg.b.x))return false;if((p.y>seg.a.y&&p.y>seg.b.y)||(p.y<seg.a.y&&p.y<seg.b.y))return false;return true;}bool IsIntersect(const SEG & L1, const SEG &L2)//判断线段是否相交{return (Cross(L1.a,L2.a,L1.b)*Cross(L1.a,L2.b,L1.b)<=0)&& (Cross(L2.a,L1.a,L2.b)*Cross(L2.a,L1.b,L2.b)<=0);}bool IsParallel(const LINE &A, const LINE &B)判断直线是否平行{double A1 ,B1, C1;double A2, B2, C2;Coefficient(A,A1,B1,C1);Coefficient(B,A2,B2,C2);return (A1*B2==A2*B1)&&((A1*C2!=A2*C1||B1*C2!=B2*C1));}POINT Intersection(const LINE &A, const LINE &B)//求直线交点{double A1,B1,C1;double A2,B2,C2;Coefficient(A,A1,B1,C1);Coefficient(B,A2,B2,C2);POINT I(0,0);if(A1*B2-A2*B1!=0){I.x=-(B2*C1-B1*C2)/(A1*B2-A2*B1);I.y=(A2*C1-C2*A1)/(A1*B2-A2*B1);}return I;}POINT Intersection(const SEG & A, const SEG & B)//求线段的交点{double A1,B1,C1;double A2,B2,C2;Coefficient(A,A1,B1,C1);Coefficient(B,A2,B2,C2);POINT I(0,0);if(A1*B2-A2*B1!=0){I.x=-(B2*C1-B1*C2)/(A1*B2-A2*B1);I.y=(A2*C1-C2*A1)/(A1*B2-A2*B1);}return I;}bool IsInCircle(const CIRCLE & circle, const RECT & rect)判断矩形是否在圆内{return (circle.x-circle.r<=rect.a.x)&&(circle.x+circle.r>=rect.b.x)&&(circle.y-circle.r<=rect.a.y)&&(circle.y+circle.r>=rect.b.y);}bool IsSimple(const POLY &poly)判断是否为简单多边形{if(poly.n<3)return false;SEG L1,L2;for(int i=0; i<poly.n; i++){L1=Edge(poly,i);for(int j=i+1;j<poly.n; j++){L2=Edge(poly,j);if(j==i+1){if(IsOnSeg(L1,L2.b)||IsOnSeg(L2,L1.a))return false;}else if(j==poly.n-i-1){if(IsOnSeg(L1,L2.a)||IsOnSeg(L2,L1.b))return false;}else{if(IsIntersect(L1,L2))return false;}}}return true;}double Area(const POLY &poly ) 多边形的面积{if(poly.n<3) return 0;double s=poly.y[0]*(poly.x[poly.n-1]-poly.x[1]);for(int i=1; i<poly.n; i++){s+=poly.y[i]*(poly.x[i-1]-poly.x[(i+1)%poly.n]);}return s/2;}double Area1(const POLY & poly)多边形的面积{if(poly.n<3) return 0;double s=0.0;POINT p0(poly.x[0],poly.y[0]);for(int i=1; i<poly.n-1;i++){POINT p1(poly.x[i],poly.y[i]),p2(poly.x[i+1],poly.y[i+1]);s+=Cross(p1,p2,p0);}return s/2;}bool IsOnPoly(const POLY & poly, const POINT & p)判断点在多边形边上{for(int i=0; i< poly.n; i++){if(IsOnSeg(Edge(poly,i),p))return true;}return false;}bool IsInPoly(const POLY &poly, const POINT & p)判断点在多边形内{SEG L(p,POINT(infinity,p.y));//射线int count=0;for(int i=0; i<poly.n;i++){SEG s=Edge(poly, i);if(IsOnSeg(s,p)){return false;}if(!IsEqual(s.a.y,s.b.y)){POINT &q=(s.a.y>s.b.y)?s.a:s.b;if(IsOnSeg(L,q)){++count;}else if(!IsOnSeg(L,s.a)&&!IsOnSeg(L,s.b)&&IsIntersect(s,L)){++count;}}}if(count==1)return true;elsereturn false;}double distance(POINT a, POINT b){return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}POINT Point;bool comp(POINT &x, POINT &y){return Cross(x,y,Point)>0||(Cross(x,y,Point)==0&&distance(x,Point)>distance(y,Point)); }void Swap(POINT &x ,POINT &y){POINT z=x;x=y; y=z;}POLY ConvexHull(POINT p[],int n)求简单多边形的凸包{int i,k=0;for(i=1; i<n; i++)if(p[k].y>p[i].y||(p[k].y==p[i].y&&p[k].x>p[i].x))k=i;Swap(p[0],p[k]);Point.x=p[0].x;Point.y=p[0].y;sort(p+1,p+n,comp);int top=2;double x[100];double y[100];x[0]=p[0].x; y[0]=p[0].y;x[1]=p[1].x; y[1]=p[1].y;x[2]=p[2].x; y[2]=p[2].y;for( i=3; i<n; i++){while(Cross(p[i],POINT(x[top],y[top]),POINT(x[top-1],y[top-1]))>=0) top--;++top;x[top]=p[i].x;y[top]=p[i].y;}POLY poly(top,x,y);return poly;}double Cross(POINT a, POINT b){return a.x*b.y-a.y*b.x;}double triArea(TRIANGLE t)//三角形面积叉积法{return fabs(Cross(t.a,t.b)+Cross(t.b,t.c)+ Cross(t.c,t.a))/2.0;}double Pow(double x){return x*x;}CIRCLE waiyuan(TRIANGLE t)//求三角形的外切圆{CIRCLE tmp;double a,b,c,c1,c2;double ax,ay,bx,by,cx,cy;a=distance(t.a,t.b);b=distance(t.b,t.c);c=distance(t.c,t.a);tmp.r=a*b*c/triArea(t)/4;ax=t.a.x; ay=t.a.y;bx=t.b.x; by=t.b.y;cx=t.c.x; cy=t.c.y;c1=(Pow(ax)+Pow(ay)-Pow(bx)-Pow(by))/2;c2=(Pow(ax)+Pow(ay)-Pow(cx)-Pow(cy))/2;tmp.x=(c1*(ay-cy)-c2*(ay-by))/((ax-bx)*(ay-cy)-(ax-cx)*(ay-by));tmp.y=(c1*(ax-cx)-c2*(ax-bx))/((ay-by)*(ax-cx)-(ay-cy)*(ax-bx));return tmp;}CIRCLE neiyuan(TRIANGLE t)求三角形的内切圆{CIRCLE tmp;double a,b,c,angleA,angleB, angleC,p,p2,p3,f1,f2;double ax,bx,cx,ay,by,cy;a=distance(t.a, t.b);b=distance(t.b,t.c);c=distance(t.c, t.a);tmp.r=2*triArea(t)/(a+b+c);//内切圆半径angleA=acos((b*b+c*c-a*a)/(2*b*c));angleB=acos((a*a+c*c-b*b)/(2*a*c));angleC=acos((a*a+b*b-c*c)/(2*a*b));p=sin(angleA/2); p2=sin(angleB/2); p3=sin(angleC/2);ax=t.a.x; ay=t.a.y;bx=t.b.x; by=t.b.y;cx=t.c.x; cy=t.c.y;f1=(Pow(tmp.r/p2)-Pow(tmp.r/p)+Pow(ax)-Pow(bx)+Pow(ay)-Pow(by))/2;f2=(Pow(tmp.r/p3)-Pow(tmp.r/p)+Pow(ax)-Pow(cx)+Pow(ay)-Pow(cy))/2;tmp.x=(f1*(ay-cy)-f2*(ay-by))/((ax-bx)*(ay-cy)-(ax-cx)*(ay-by));tmp.y=(f1*(ax-cx)-f2*(ay-by))/((ay-by)*(ax-cx)-(ay-cy)*(ax-bx));return tmp;}bool IspointIntri(TRIANGLE t, const POINT & p)//点在三角形内还是外?{double k1,k2,k3;k1=Cross(t.a,t.b,p);k2=Cross(t.b,t.c,p);k3=Cross(t.c,t.a,p);cout<<k1<<" "<<k2<<" "<<k3<<endl;if(k1*k2<0) return false;if(k1*k3<0) return false;return true;}POINT duichendiandian(POINT p1, POINT p2)//对称点点对点{POINT p3;p3.x=2*p2.x-p1.x;p3.x=2*p2.x-p1.y;return p3;}POINT duicedianxian(POINT p, LINE l)//点对线对称{POINT p2;double d;d=l.a*l.a + l.b*l.b;p2.x=(l.b*l.b*p.y-l.a*l.a*p.x-2*l.a*l.b*p.y-2*l.a*l.c)/d;p2.y=(l.a*l.a*p.y-l.b*l.b*p.y-2*l.a*l.b*p.x-2*l.b*l.c)/d;return p2;}double diandaoxianjuli(POINT p, LINE l)//点到线的距离{return fabs(l.a*p.x+l.b*p.y+l.c)/sqrt(l.a*l.a+l.b*l.b);}double xili(LINE l){if(l.b!=0)return -(l.a/l.b);elsereturn infinity;}int main(){POINT a(0,0),b(1,0),c(0,1),d(-1,3),e(0,2),f(2,0),g(2,2);CIRCLE o(0,0,2);RECT s(d,a);LINE A(a,c),B(c,e);SEG AB(a,b),BC(f,g);double x[10]={2,3,2,1,0,1,0,1.5,1.6,0.1};double y[10]={0,1,2,2,1,0,0,1.5,1.6,0.5};POINT po[10];for(int i=0; i<10;i++){po[i].x=x[i];po[i].y=y[i];}POLY p(6,x,y);if(IsEqual(a,b)) cout<<"yes"<<endl;else cout<<"NO"<<endl;if(IsEqual(A,B)) cout<<"yes"<<endl;else cout<<"NO"<<endl;if(IsParallel(A,B)) cout<<"yes"<<endl;else cout<<"NO"<<endl;if(IsIntersect(AB,BC)) cout<<"yes"<<endl;else cout<<"No"<<endl;POINT w=Intersection(AB,BC);cout<<w.x<<" "<<w.y<<endl;if(IsInCircle(o,s)) cout<<"yes"<<endl;else cout<<"no"<<endl;if(IsSimple(p)) cout<<"yes"<<endl;time_t cb=clock();double s1=Area(p);time_t cd1=clock();double s2=Area1(p);if(IsInPoly(p,f)||IsOnPoly(p,f)) cout<<"yes"<<endl; else cout<<"no"<<endl;POLY poly=ConvexHull(po,10);for(i=0; i<=poly.n;i++)cout<<poly.x[i]<<" "<<poly.y[i]<<endl;time_t cd2=clock();cout<<s1<<" "<<s2<<endl;cout<<endl;TRIANGLE t;POINT a1(-2,0),a2(2,0),a3(0,2),a4(0,1),a5(3,5),a6(0,0); t.a=a1; t.b=a2; t.c=a3;cout<<"三角形面积"<<triArea(t)<<endl; CIRCLE C=waiyuan(t);cout<<C.r<<" "<<C.x<<" "<<C.y<<endl;C=neiyuan(t);cout<<C.r<<" "<<C.x<<" "<<C.y<<endl;cout<<"点是不是在三角形内"<<IspointIntri(t,a1)<<endl;cout<<IspointIntri(t,a4)<<endl;cout<<IspointIntri(t,a5)<<endl;cout<<"p1对P2的对称点P3"<<endl;POINT p3=duichendiandian(a3,a4);cout<<p3.x<<" "<<p3.y<<endl;cout<<"点对线的对称点"<<endl;LINE L(a3,a5);p3=duicedianxian(a6,L);cout<<p3.x<<" "<<p3.y<<endl;cout<<cd1-cb<<" "<<cd2-cb<<endl;cout<<"点到直线的距离"<<endl;cout<<diandaoxianjuli(a4,L)<<endl;cout<<xili(L)<<endl;char q;cin>>q;return 1;}Wallacstruct POINT{double x ,y;POINT (): x(0),y(0){};POINT ( double _a, double _b): x(_a), y(_b){};};double Cross(POINT a, POINT b, POINT o){return (a.x-o.x)*(b.y-o.y)-(a.y-o.y)*(b.x-o.x);}double Pow(double x){return x*x;}double distance(POINT a, POINT b){return sqrt(Pow(a.x-b.x)+Pow(a.y-b.y));}POINT Point;bool comp(POINT &x, POINT & y){return ( Cross(x,y,Point)>0||(Cross(x,y,Point)==0&&( distance(x,Point) > distance(y,Point) ) )); }void Swap(POINT &x, POINT &y){POINT z=x;x=y; y=z;}int n,l;POINT p[1000];POINT p1[1000];int top=0;int main(){int i;cin>>n>>l;for(i=0; i<n; i++)cin>>p[i].x>>p[i].y;int k=0;for(i=1; i<n; i++){if(p[i].y<p[k].y||(p[i].y==p[k].y&&p[i].x<p[k].x))k=i;}Swap(p[0],p[k]);Point=p[0];sort(p+1,p+n,comp);p1[0]=p[0];p1[1]=p[1];p1[2]=p[2];top=2;for(i=3; i<n; i++){while(Cross(p[i],p1[top],p1[top-1])>0) --top;++top;p1[top]=p[i];}double sum=0.0;cout<<top<<endl;for(i=0; i<top; i++){sum+=distance(p1[i],p1[i+1]);cout<<p1[i].x<<" "<<p1[i].y<<endl;}sum+=distance(p1[top],p1[0]);cout<<sum<<" "<<2*pi*l<<endl;long z=(sum+2*pi*l+0.5);cout<<z<<endl;return 0;}最小半径圆:#include<cstdio>#include<iostream>using namespace std;#include<cmath>#define maxn 1000#define eps 1e-6struct POINT{double x, y;POINT():x(0),y(0){};};struct Circle{double r;POINT center;};struct Triangle{POINT a,b,c;};POINT a[maxn+1];Circle c;int casenum, n;double Pow(double x){return x*x;}double distance(POINT a, POINT b){return sqrt(Pow(a.x-b.x)+Pow(a.y-b.y)); }double Cross(POINT a, POINT b, POINT o){return (a.x-o.x)*(b.y-o.y)-(a.y-o.y)*(b.x-o.x); }double triangleArea(POINT t[3]){return fabs(Cross(t[0],t[1],t[2]))/2;}Circle circleoftriangle(POINT t[3]){Circle tmp;double a,b,c,c1,c2;double ax,ay,bx,by,cx,cy;a=distance(t[0],t[1]);b=distance(t[1],t[2]);c=distance(t[2],t[0]);tmp.r=a*b*c/triangleArea(t)/4;ax=t[0].x; ay=t[0].y;bx=t[1].x; by=t[1].y;cx=t[2].x; cy=t[2].y;c1=(Pow(ax)+Pow(ay)-Pow(bx)-Pow(by))/2; c2=(Pow(ax)+Pow(ay)-Pow(cx)-Pow(cy))/2; tmp.center.x=(c1*(ay-cy)-c2*(ay-by))/((ax-bx)*(ay-cy)-(ax-cx)*(ay-by)); tmp.center.y=(c1*(ax-cx)-c2*(ax-bx))/((ay-by)*(ax-cx)-(ay-cy)*(ax-bx)); return tmp;}Circle MinCircle2(int tce, POINT ce[3]){Circle tmp;tmp.center.x=0;tmp.center.y=0;tmp.r=0;switch(tce){case 0: tmp.r=-2;break;case 1: {tmp.center=ce[0];}break;case 2: {tmp.r=distance(ce[0],ce[1])/2;tmp.center.x=(ce[0].x+ce[1].x)/2;tmp.center.y=(ce[0].y+ce[1].y)/2;} break;case 3:{tmp=circleoftriangle(ce);} break;}return tmp;}void Swap(POINT &x, POINT &y){POINT z=x; x=y; y=z;}bool inCirclr(POINT p , Circle c){return distance(p, c.center)<c.r+eps;}void MinCircle(int t, int tce, POINT ce[3]){int i;POINT tmp;c=MinCircle2(tce,ce);if(tce==3) return;for(i=1;i<=t; i++){if(distance(a[i],c.center)>c.r+eps){ce[tce]=a[i];MinCircle(i-1,tce+1,ce);}}}void run(){POINT ce[3];MinCircle(n,0,ce);printf("%.2f %.2f %.2f\n",c.center.x,c.center.y,c.r); }int main(){cin>>casenum;int i;while(casenum>0){cin>>n;for(i=1; i<=n; i++)cin>>a[i].x>>a[i].y;run();casenum--;}}//数论模板#include<iostream>#include<cmath>using namespace std;//辗转相除法求最大公约数long gcd(long a, long b){if(b==0)return a;elsereturn gcd(b,a%b);}//求最大公倍数long lcm(long a, long b){if(a*b==0) return 0;elsereturn a*b/gcd(a,b);}//求a^b mod nlong modexp(long a, long b, long n){int t, y;t=1; y=a;while(b!=0){if(b&1==1)t=t*y%n;y=y*y%n;b/=2;}return t;}//扩展的Euclid算法//返回a.b的最大公约数,并使ax+by=d; long exEuclid(long a, long b, long & x, long & y) {long tmp,d;if(b==0){y=0;return a;}d=exEuclid(b, a%b, x,y);tmp=x;x=y;y=tmp-a/b*y;return d;}//解线性同余方程ax=b(mod n)//返回最小的xlong modu(long a, long b, long n){long d,x=1,y=0;d=exEuclid(a,n,x,y);x=x*(b/d);x=(x%(n/d)+n/d)%(n/d);return x;}//用中国剩余定理解同余方程组a=bi(modni) long solmodu(long z, long b[], long n[]){int i;long a,m,x,y,t;m=1 ;a=0;for(i=0; i<z; i++) m*=n[i];for(i=0; i<z; i++){t=m/n[i];exEuclid(n[i],t,x,y);a=(a+t*y*b[i])%m;}return (a+m)%m;}//筛法求素数const maxn=100000;bool prime[maxn+1];void searchprime(long b[],long & k){int i ,j;memset(prime,0,sizeof(prime));prime[1]=1;for(i=2; i<sqrt(maxn); i++)if(!prime[i]){j=i*2;while(j<=maxn){prime[j]=1;j+=i;}}j=0;for(i=1; i<maxn; i++)if(prime[i]==0)b[j++]=i;k=j;}//判定素数素数表bool isPrime(long x,long b[]){int i;i=1;while(b[i]*b[i]<=x){if(x%b[i]==0)return 0;i++;}return true;}//判定素数,概率方法bool passTest(long n){long l ,m,b,i,k;m=n-1;l=0;while(m%2==0){l++;m/=2;}b=rand()%n+1;if(modexp(b,m,n)==1) return 1;k=m;for(i=0; i<l; i++){if(modexp(b,k,n)==n-1) return 1;k*=2;}return 0;}取子游戏#include <iostream>#include <cmath>using namespace std;int main(){double alpha = (1.0 + sqrt(5.0)) / 2.0;double beta = (3.0 + sqrt(5.0)) / 2.0;int big, small, n, temp1, temp2;while(cin>>big>>small){if(big < small)swap(big, small);n = ceil(big / beta);temp1 = alpha * n;temp2 = beta * n;if(small == temp1 && big == temp2)cout<<0<<endl;else cout<<1<<endl;}return 0;}二维树状数组1195#include<cstdio>#include<iostream>using namespace std;int c[1025][1025];int n, cmd;static inline int lastexp(int i){return i&(-i);}void modify(int x, int y, int a){int i, j;for(i=x; i<=n; i+=lastexp(i))for(j=y; j<=n; j+=lastexp(j))c[i][j]+=a;}long getsum(int x, int y){long total=0;int i, j;for(i=x; i>0; i-=lastexp(i))for(j=y; j>0; j-=lastexp(j))total+=c[i][j];return total;}void modify1(){int x, y, a;scanf("%d%d%d",&x,&y,&a);x++;y++;modify(x,y,a);}long getsum1(){int a,b,c,d;scanf("%d%d%d%d",&a,&b,&c,&d);a++; b++; c++; d++;return getsum(c,d)-getsum(c,b-1)-getsum(a-1,d)+getsum(a-1,b-1); }int main(){long s;while(1){cin>>cmd;switch(cmd){case 0: memset(c,0,sizeof(c)); cin>>n; break;case 1: modify1(); break;case 2: s=getsum1(); printf("%ld\n",s); break;case 3: goto L;}}L: return 0;}图论模板最小生成树:1 prime算法:#include<iostream>#include<fstream>using namespace std;#define maxn 201#define Max 10000ifstream fin("g.txt");int g[maxn][maxn];int best[maxn];bool s[maxn];int bian[maxn];int sum,n;void Prim(int k){int i,j;bian[k]=-1;best[k]=0;for(i=1; i<=n; i++){int min=Max;int t=k;for(j=1; j<=n; j++)if(!s[j]&&min>best[j]){min=best[j];t=j;}s[t]=1;sum+=min;for(j=1; j<=n; j++)if(!s[j]&&g[t][j]>0&&best[j]>g[t][j]){best[j]=g[t][j];bian[j]=t;}}}int main(){int i, j;fin>>n;for(i=1; i<=n;i++)for(j=1; j<=n; j++)fin>>g[i][j];memset(s,0,sizeof(s));memset(best,10000,sizeof(best));Prim(1);for(j=n; j>1;j-- )cout<<bian[j]<<" "<<j<<endl;cout<<sum<<endl;return 0;}2 kruskal算法:#include<iostream>#include<fstream>#include<algorithm>using namespace std;ifstream fin("g.txt");struct Edge{int x,y,c;};int g[100][100];int pa[100];int root[100];Edge b[1000];int n,e,sum=0;bool comp(Edge &x, Edge &y){return x.c<y.c;}int Find(int x){int i,j=x;while(!root[j]) j=pa[j];while(j!=x)//路劲压缩都指向j(树根){i=pa[x];pa[i]=j;x=i;}return j;}void Union(int x, int y){if(pa[x]<pa[y]){pa[y]+=pa[x];root[x]=0;pa[x]=y;}else{pa[x]+=pa[y];root[y]=0;pa[y]=x;}}void Kruskal(){sort(b,b+e,comp);int i,j=0,sum=0;for(i=0; i<e;i++){int a,c;a=Find(b[i].x);c=Find(b[i].y);//注意a,c是所在边上点的根结点;if(a!=c){sum+=b[i].c;cout<<b[i].x<<" "<<b[i].y<<endl;Union(a,c);j++;}if(j==n-1) break;}cout<<sum<<endl;}int main(){int i, j;fin>>n;e=0;for(i=1; i<=n; i++){pa[i]=1;root[i]=1;for(j=1; j<=n;j++){fin>>g[i][j];if(j>i&&g[i][j]>0){b[e].c=g[i][j];b[e].x=i;b[e].y=j;e++;}}}Kruskal();return 0;}二最短路Dijkstra算法:1.#include<iostream>#include<fstream>using namespace std;#define MAX 10000#define maxn 201ifstream fin("g.txt");int g[100][100];int d[100];int p[100];bool s[100];int n;void dijkstra(int k){d[k]=0;int i,j;for(i=2; i<=n; i++){int min=MAX;int t=k;for(j=1 ;j<=n; j++)if(!s[j]&&d[j]<min){min=d[j];t=j;}s[t]=1;for(j=1; j<=n; j++)if(!s[j]&&g[t][j]>0&&d[j]>d[t]+g[t][j]){d[j]=d[t]+g[t][j];p[j]=t;}}}int main(){int i,j;fin>>n;for(i=1; i<=n ;i++)for(j=1; j<=n ; j++)fin>>g[i][j];memset(d,10000,sizeof(d));memset(s,0,sizeof(s));p[1]=0;dijkstra(1);for(i=1; i<= n; i++){cout<<"1---"<<i<<" ";cout<<d[i]<<" ";j=i;while(j){cout<<j<<" ";j=p[j];}cout<<endl;}return 0;}2 Bellman_Ford算法:#include<iostream>#include<fstream>#include<deque>using namespace std;#define MAX 10000#define maxn 201ifstream fin("g.txt");int g[100][100];int d[100];int count[100];int p[100];int n;deque<int> Q;bool Bellman_Ford(int k){Q.push_back(k);int j;d[k]=0;while(!Q.empty()){int i=Q.front();Q.pop_front();count[i]++;if(count[i]>n) return false;for(j=1; j<=n; j++)if(g[i][j]!=0&&d[j]>d[i]+g[i][j]){d[j]=d[i]+g[i][j];p[j]=i;Q.push_back(j);}}return true;}int main(){int i,j;fin>>n;memset(count,0,sizeof(count));for(i=1;i<=n;i++)for(j=1;j<=n;j++)fin>>g[i][j];memset(d,10000,sizeof(d));p[1]=0;bool b=Bellman_Ford(1);if(b){for(i=1;i<=n;i++){cout<<"1---"<<i<<" ";cout<<d[i]<<" ";j=i;while(j){cout<<j<<" ";j=p[j];}cout<<endl;}}elsecout<<"qw"<<endl;return 0;}三图的dfs应用链表拓扑排序(有向图)割点桥。