




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
ACM常用模板(+模板題)(基礎//題目://題目大意就是問你用2*1,1*2,2*2的磚拼成2*n的長方形,//解題思路考慮n的時候,假設我們已經鋪好了n-1塊磚,第n//所以f[n2*f[n-2f[n-#include#include#includeusingnamespaceconstintmaxn=10000+stringbigIntegerAdd(strings1,stringint;;;int1=s1.size(),len2=intmaxL=;for(inti=0;i<l;ii]=s1[len1-1-i]-for(inti=0;i<l;i)]=s2[len2-1-i]-for(inti=0;i<a; iai]+bi]>=intep=;a[i]=;a[i]+= elsea[i]+=;}ngc=maxL]!=c+=a[aL]+for(inti=maxL-1;i>=0;i--)c+=a[i]+return}stringbigIntegerMul(strings1,stringintaan]ban]can2+;;;int1=s1.size(),len2=for(inti=0;i<l;ii]=s1[len1-1-i]-//倒for(inti=0;i<l;i)]=s2[len2-1-i]-for(inti=0;i<l1;{for(intj=0;j<l2;{i+]+=;}}for(inti=0;i<an;{if(c[i]>=i]+=;c[i]%=}}sringans=intfor(i=maxn*2;i>=0;i--if(c[i]!=for(;i>=0;i--)ans+=c[i]+return}intintrings[0]="1",s[1]= for(inti=2i<=255;sringemp=bigIntegerMul("2",s[i-s[i]=bigIntegerAdd(s[i-});return}1#include>2constintmaxn=200+3usingnamespace4typedeflonglong567stringsubInfo(char*s1,char8int;9;;int1=strlen(s1),len2=intmaxLen=;for(inti=0;i<len;i+)a[i]=s1[len1-i-for(inti=0;i<len;i+)i]=s2[len2-i-for(inti=0;i<n;{if(a[i]-[i]<a[i]=ai0;a[i]-=}elsea[i]-=}srgstr=intfor(i=maxLen-1;i>=0;i-- !=for(;i>=0;i--)str+=;return}stringbigIntegerSub(char*s1,charif(s1==return"0";//相int1=strlen(s1),len2=if(len1>)returnelseif(len1<)return"-"+subInfo(s2,s1);//負else for(inti=0;i<l1;{if(s1[i]-'0'>s2i-returnelseif(s1[i]-'0'<s2i-return"-"+}}}char;;return} #includeusingnamespaceconstintmaxn=100000+6intfactorialDigit(intdoublesum=for(inti=1;i<=n;{sum+= return; stringbigFactorial(intintn[max]it=ans[0]=for(inti=2;i<=n;{intnum=for(intj=0;j<ii;intep=an[]i+an[]=;num=;}w(um!=ans[digit]=;num/=;}}sringstr=for(inti=igi-1;i>=0;i--str+=ni]+return}int{; }return}求最大的i的下一個元素的下標c++中的upperbound函數),使得a[i]=key,若不存在,則返回-1; 2usingnamespaceconstintmaxn=100+5intcmp(constvoid*a,constvoid*b)return*(int*)a-*(int*) 9intbs(int*arr,intL,intR,intwhile(L<= intid=(L)+(R-if(arr[mid]==return;if(arr[mid]>R=md-L=d+ return-1;//not //求最小的i,使得a[itarget,若不存在,則返回-//返回如果有重復的下界(比如1,2,2,2,3,4)查找2,返回intfirstEqual(intarr[],intL,intR,inttarget)while(L<R)intid=L+(R-L)/if(arr[mid]<L=d+R= if(arr[L]==returnreturn- //求最大的i的下一個元素的下標(c++中的upperbound函數),使得a[itargetintlastEqualNext(intarr[],intL,intR,inttarget)while(L<R)intm=L+(R-L)/ifr[m]<=L=m+R=}if(arr[L-1]==returnreturn-}//求最大的i,使得a[itarget,若不存在,則返回-intlastEqual(intarr[],intL,intR,inttarget)while(L<R)intid=L+((R+1-L)>>1);//向上if(arr[mid]<=L=R=md-}if(arr[L]==returnreturn-}//求最小的i,使得a[itarget,若不存在,則返回-intfirstLarge(intarr[],intL,intR,int{while(L<R)intm=L+((R-L)>>1);//向下取ifr[m]<=L=m+R=}if(arr[R]>returnreturn-}//求最大的i,使得a[itarget,若不存在,則返回-intlastSmall(intarr[],intL,intR,inttarget)while(L<R)
intm=L+((R+1-L)>>1);//向上取整ifr[m]<target)L=R=m-
if(arr[L]<target)returnL;return-intmain()//freopen("in.txt","r",intn,a[a],scanf("%d",for(inti=0;i<n;i)anf("",ai);scanf("%d", //inputthenumberyouneed qsort(a,n,sizeof(a[0]),; //1122233printf("aftersorted:for(inti=0;i<n;i+)(d",
printf("\n%d\n",firstEqual(a,0,n,v)); //output2第一個printf("%d\n",lastEqualNext(a,0,n,v));//output4+1,最后一個printf("%d\n",lastEqual(a,0,n,v)); //output4最后一個printf("%d\n",firstLarge(a,0,n,v)); //output5(第一個3大于2printf("%d\n",lastSmall(a,0,n,v)); return0;
枚舉排列的算法也有幾個,包括書上的和經典的,還有做過的幾個題LeetCode47LeetCode46 #include2usingnamespaceconstintmaxn=100+5voidpermutation(int*arr,intn,intif(cur== for(inti=0;i<n;printf("%d elsefor(inti=1;i<=n; boollag=for(intj=0j<cur)ii== 如果i已經在lag= arr[cur
permutation(arr,n,;}}求1~n的全排列,arrintmain(intargc,charconst{intmax,scanf("%d",permutation(a,n,return #includeconstintmaxn=100+4voidpermutation(int*arr,int*p,intn,intif(cur==for(inti=0;i<n;printf("%d }elsefor(inti=0;i<n;i(!i||pi]!=i-intc1=0,c2=for(intj=0;j<n;ip[]==p ;for(intj=0;j<cur;if(arr[j]==[i])前面已經排列的重復元素的 ; if(c2<arr[cur]=;permutation(arr,p,n,; } intint[maxn,[an]={5,6,7, std::sort(p,;permutation(a,p,4,return}12#include3usingnamespace4constintmaxn=100+56voidpermutation(intarr[],intcur,7if(cur==8for(inti=0;i<n;9printf("%d",}elsefor(inti=cur;i<n;{aprr[i,permutation(arr,u+,aprr[i,}}intintn,;scanf("%d",for(inti=0;i<n;scanf("%d",;permutation(a,0,return}#includeusingnamespaceconstintmaxn=100+4voidprint_subset(int*arr,intn,intfor(inti=0;i<cur;printf("%d",ints=cur?arr[cur-1]+1: for(inti=s;i<n;{print_subset(arr,n,; intintn,;scanf("%d",print_subset(arr,n,return 1~n#includeconstintmaxn=100+usingnamespaceintia//位向量bits[i1,當且僅當i在子集A6 voidprint_subset(intn,int8if(cur==9for(inti=0;i<cur;printf("%d}itsur]=print_subset(n,cur+itsur]=print_subset(n,cur+}main()intscanf("%d",return}二進制枚舉子集用的多,這里舉個例子n=3;則要枚舉0-7對應的是有7個子集,每個子集去找有哪些元素print_subset中的1<<i,也就是對應的那個位置是有元素的,例100010001021代表第2個位置上有元素,相應的1000=8對應第31<<ii1(0開始)0//0~n-1的所有子集:二進枚舉0~n-1的所有子#includeconstintmaxn=100+4usingnamespacevoidprint_subset(intn,int//這一步其實就是判斷cur的二進制的各個位上是不是1,如果是1,for(inti=0;i<n;if(1&(cur>>printf("%d intmain(intargc,charconst**{int;for(inti=0;i<(1<<n);n_sutni)//枚舉各子集對應的編碼0,1,2...pow(2,n)-return}123456789#include<bits/stdc++.h>constintmaxn=100+10;usingnamespacestd; t;//解的個數,n皇后int;voidSearch(int ;if(cur==;elsefor(inti=0;i<n; boollag=ur]= //嘗試把第cur行的皇后放在第i列//如果等下不行的話就下for(intj=0;j<cur;//檢查是否和已經放置的i(C[c]==[]||cu]+cur==C[]+j||cur-lg=}};}} //輸入n皇sum=cnt=0;//解的個數和遞歸的次printf("%d return}n#includeconstintmaxn=100+usingnamespace5 int;bool; a[xax]//voidSearch(int ;if(cur==;for(inti=0;i<cur;i)api][Ci]]=1;//打印for(inti=0;i<n;{for(intj=0;j<n;++rinf("%d; // elsefor(inti=0;i<n;){//嘗試在cur行的各列放置皇后 ivi0i]&&vi1cr+i]&&!vis[2][cur-in]){//判斷0i]=i[][r]=vi[][cur]=cr]=ir行的列是;0i]=i[][r]=vi[][cur]=false;// ;;;sum=cnt=printf("%d% t);//輸出解決方案和遞歸次return}//題目連接://題目大意:傳染,可以通過一些社團接觸給出一些社團(0號人物是被的)問有#includeconstintmaxn=100000+5 ; 7voidfor(inti=0;i<an;i++aenti]=i;//注意這for(inti=0;i<an;in]= //intfindRoot(int returnparent[v]==v?v:parent[v]=intfindRoot(intwhile(parent[v]!=parent[v]parent[parent[v]];路徑壓v= return voidunions(inta,intintaRoot=intbRoot=if(aRoot==if(rank[aRoot]<parent[aRoot]=elseif(rank[aRoot]>parent[bRoot]=parent[aRoot]=;}}){returnfindRoot(x)==}int;wile~cn("%dd",&n&m)&&{for(inti=0;i<;{;for(intj=1;j<k;{;}}intsum=for(inti=1;i<n;if(findRoot(i)==u;//找和0;}return}intlowbit(intreturn(x);//或者returnx&(x^(x- 這里給出一個例題題目中一個重要的信息就是輸入是按照y遞增,如果y相同則x遞增的順序給出的,所以,對于第i顆星星,它的level就是之前出現過的星星中,橫坐標小于等于i的星星的數量。這里用樹狀數組來記錄所有星星的x值。x+這是因為lowbit不能傳值為0#include#includeconstintmaxn=32000+int;5intlowbit(intreturn&- voidupdate(inti,intwhile(i< c[i]+=
}
intsum(intints=while(i> s+= i-=
returnintint;;;for(inti=0;i<n;{ ; ; for(inti=0;i<n;return SPPS中的位//題目連接: //題目大意找第二個數組在第一個數組中出現的位置,如果不存在,輸出-#includeconstintmaxn +int[],b[10000+10],nexts[10000+6voidgetNext(int*p,intnext[]) intn=next[0]=- //next數組中的最大長度值(前后綴的公共最大長度)intk=-1j=while(j<ln-1)ifk1||[]p[k])//p[k]表示前綴p[j+;ip[]!=p[k])next[j]=elsenex[]= //因為不能出現p[j]opnext[j elsek=}}KMPSerach(int*s,int*p)intsLen=n,pLen=inti=0,j=while(i<sLen&&j<pLen)if(j==-1||s[i]==ji++,;elsej=;}elsereturn-}main()intscanf("%d",;while(T--)scanf("%d%d",n,for(inti=0;i<n;i+",;for(inti=0;i<;i+",;getNext(b,nexts);//獲取nextintans=KMPSerach(a,if(ans!=-1)printf("%d\n",ans+elseprintf("-}return} 3#include#include#includeusingnamespaceconstintmaxn=9intlast(char*p,charc){//找到文本串 "壞字符"在模式串中的位for(inti=strlen(p)-1;i>=0;i--)ifpi]==c)returnreturn- intBM_index(char*T,char*p)intn=intm=inti=m-1,j=m-while(i<=n-1)ifTi]==)elsei--,j--elsei=i+m-min(j,1+last(p,Ti//jm1;//模式串的新 return- intSucar*T,char*P,ints){//輸出文本串中包含模式串的數
inte=BM_index(T+s,returne==-1?0:1+uT,P,s+e+//測試數據intmain()char;while(~scanf("%s",s))intcnt=BM_index(s,if(cnt==-else return Sunday :#include#include#includeconstintmaxn=usingnamespace8intlast(char*p,charc)for(inti=strlen(p)-1;i>=0;i--)ifpi]==c)returnreturn- intSunday(char*s,char*p)intsLen=intpLen=inti=0,j=while(i<sLen&&j<pLen)if(s[i]==i++,;elseintinex=i+pLen- if(last(p,s[index])==-1){i=index+1;j=0; elsei=inex-last(p,s[index]);j=0;//否 }return-}main()char;while(~scanf("%s",s))intcnt=if(cnt==-else}return}/article/details/
beginning/article/details/ /article/details///題目連接: #include#include#include6const6constintmaxn=; int;8voidprint(intn,intfor(inti=n;i>1;i-- i(pi]C]==dp[i1][C-wi]+ vis[i]= C-=;} vi[1]=(p1]C]>0)?1: intint;;while(T-- ;for(inti=1i<=n;i);for(inti=1i<=n;i);eset(0(;//dp[0][0~C]和dp[0~N][0]都為0;for(inti=1;i<=n;{for(intj=0j<=;{pi][]=i-; if(j>= maxpi[j]pi-[ pn(ndp[n][C]);//n個物品裝入C //for(inti1ini++)if(vis[i])printf("%d",i) return #include #include #includeconstintconstintmaxn=;467;89int;;while(T--;for(inti=1;i<=n;;for(inti=1;i<=n;;; for(inti=ni>=1;i--for(intj=0;j<=;{dpi][j]=(i==n?0:;if(j>=wi)dpi[j]=ma(i][j]i+1][j-+}};}return}1234constmaxn=; usingnamespace6 int;8intint;;while(T-- ;for(inti=1;i<=n;;for(inti=1;i<=n;;;for(inti=1;i<=n;{if(j>=widp[j]=madp[]p[j-; };}return}01i件物品的時候,不是考1(inti=1;i<n;{2for(intj=1;j<=v;{3for(intk=0;i]<=j;{4if(c[i]<=j)dpi]]=ax{d[ipi-1j-k*5]=dpi-][j]/繼承前i個物品在當前空間大小時的價值6}7}8}優化注意完全背包的順序問題:因為每種背包都是無限的。當我們把i從1到N循環時,dp[v]表示第i次循環中的狀態dp[i][v]是由狀態dp[i-1v-c[i]]遞推而來。這正是為了保證每件物品只選一次,保證在考慮“選入第i件物品”這件策略時,依據的是一個絕無已經選入第i件物品的子參考博客Ho/article/details/ #include#include#include4usingnamespaceconstintmaxn=50000+constintF=-int;9intint;;while(T--;for(inti=1;i<=C;i+)d[i]=;dp[0]=for(inti=0;i<n;;for(inti=0;i<n;{for(intj=wi;j<=;//從前往后遞推,這樣才能保dp[]=[,di]+}}dp]>;else}return}先說O(N*N)的解法,第i個元前的最長遞增子序列的長度要么是1(單獨成一個序列),要么就是第i-1個元前的最長遞增子序列加1,這樣得到狀態方程: LIS[i]=a1S}?ki,ari]>這樣arr[i]才能在arr[k]//題目連接: #include#include#includeusingnamespaceconstintmaxn=10000+7intd[a];/*dp[i]記錄到[0,i]數組的LISintxx*LIS長度,初始化為1intLIS(char*arr,intn)for(inti=0;i<n;i+) i]=for(intj=0;j<i;++)注意iif(arr[j]<arr[i])i]=axpi],d[]+ maxx=maxmax,;}return;}/*遞歸輸出LIS,因為數組dp還充當了“標記”作用voidprintLis(char*arr,inte)boolisLIS=if(index<0||maxx==if(dp[index]==a);isLIS= --if(isLIS)printf("%c",arr[index+ intmain()char;int;while(n--maxx= return nlog(n)的解法: //題目連接:#include#include#include#includeusingnamespace78constintF=9constintmaxn=100000+int[an,dmax,oma,;vector<int>intcmp(inta,intreturna<=}intLIS(intmemset(dp,0x3f,pos[0]=-intfor(i=0;i<n;{dp[lpos=(lower_bound(dp,dp+n,a[i])-dp)]=pos[lpos]= *fa[i]=(lpos?pos[lpos-1]:-}n=lower_bound(dp,dp+n,F)-for(i=pos[n-1];~ai];i=fa[i]);;return}intLISS(intmemset(dp,0x3f,pos[0]=-intfor(i=0;i<n;{dp[lpos=(lower_bound(dp,dp+n,c)-dp)]=/pos[lpos]= *fa[i]=(lpos?pos[lpos-1]:-}n=lower_bound(dp,dp+n,F)-for(i=pos[n-1];~ai];i=fa[i]);;return}//int{for(inti=0i<n;;//for(inti=ans.size()-1;i>=0;i--)printf("%d}return}dp[i][j]記錄XiYi的最長公共子序列的長度i=0j=0時,空序列時Xi和Yi的最長公共子序列,其余情況如下//題目連接:#include#include#includeusingnamespaceconstintmaxn=1000+int; //9intLCS(char*s1,charintl1=strlen(s1)-1,len2=strlen(s2)-1;//注意例如abcfbc的for(inti=0;i<=le;i)pi]0]=for(inti=0;i<=le;i)p0]i]=for(inti=1;i<=l;{for(intj=1;j<=l; if(s1[i]=={ dpi][j]=dpi-1][j1]+ pati][]= elseidpi1][]>=i[1]) di[]=di; pati][]= else pi[]=ij pati][]= return voidprint(inti,intj,charif(i==0||j==0)returnif(path[i][j]== print(i-1printf("%c}elseif(path[i][j]==print(i-;}elseprint(i,j- intchar; //注意s1[0]不取-注意例 abcfbc的; return 有向無環圖上的一種排序方式,我的這篇博客也講解了一下。可以兩種寫法//題目:2#include34usingnamespace5constintmaxn=100+67intn,8int;9;void;for(inti=1;i<=n;if(in[i]==;boollag=intcur=lag=}printf("for(inti=0;i<{if(--G[]==;}}}intmain(intargc,charconst{intrm,while(~scanf("%d%d",&n,&)&&(n
memset(in,0,sizeof(in));for(inti=1;i<=n;;for(inti=0;i<;i++){scanf("%d%do,o);io++;//度;}
return#include #includeusingnamespace 6typedefstruct{///鄰接表實intnext_arc;///下一條int;rc;/// rc[n//每條 exnsxnxn//每個頂點,node[i]表示第i個頂intn,mvoiddfs(intv)for(inti=node[v];i!=-1;i=arc[i].next_arc)(!vis[arc[i].point])}}=top[--t]=}intmain()inta,while(cin>>n>>m&&m||n))memset(node,-1,memset(vis,0,for(inti=1;i<=;i+)n>>a>>arc[i].next_arc=node[a];///arc[i].point=node[a]=vis[arc[i].point]=}t=for(intj=1;j<=n;++)if(!vis[j])for(inti=0;i<n-1;cout<<to[i]<<"cout<<top[n-1]<<}return}首先看定義圖G0,對于有向圖來說每個點的入度必須等于圖G對于無向圖來說,度數為奇數的的點可以有2個或者0個,并且這兩個奇點其中一中一個入度比出度大1,為路徑的起點;另外一個出度比入度大1,為路徑的終點。判斷連通的方式有DFS或者并查集,然后再判斷一下是否滿足條件即可,之前做的 1#include23constintmaxn=1000+4usingnamespace56bool;7int;8intn,9;voiddfs(intviu]=for(inti=0;i<;{);}}intintrm,while(scanf("%d",&n)!=EOFscanf("%d",memset(vis,0,memset(in,false,for(inti=1;i<=n;;boollag=for(inti=0;i<;{anffrom,;;;;;}for(inti=1;i<=n;if(in[i]%2!=lag=for(inti=1;i<=n;lag=}return}<<(flag?1:}return}1 3constintmaxn=1000+usingnamespace6 intn,,;8voidfor(inti=0;i<an;eni]=for(inti=0;i<an;nksi]= //intfindRoot(int returnparent[v]==v?v:parent[v]=intfindRoot(intwhile(parent[v]!=parent[v]=v= return voidunions(inta,intintaRoot=intbRoot=if(aRoot==if(ranks[aRoot]<parent[aRoot]=elseif(ranks[aRoot]>parent[bRoot]=
}elseparent[aRoot]=bRoot;;}intintu,while(scanf("%d",&)!=EOF&&scanf("%d",;for(inti=0;i<;{ cn("d%d",&u,unions(u,;; boollag=intemp=for(inti=1;i<=n;if(findRoot(i)!=)lag=for(inti=1;i<=n; if(in[i]%2!=lag=false;//判斷cout<<(flag?1:0)<<;}return}這里舉幾個比較好的題目POJ3984,這個題目要求記錄BFS最短路的路徑,我這里使用三DFS加回溯4#include#include#include#include#include #pragmai(iale:usingnamespaceconstintmaxn=100+intint;bool;intir4][2]={{-1,0},{0,1},{1,0},{0,-1}};//對應上,右,下,structRoad//intx,y,d;//d表示Road(){}//Road(inta,intb,intc):x(a),y(b),d(c){}// structnode//intvcor<Road>v;//記錄路徑的結構 boolcheck(nodeu) if(!vis[u.x][u.y]&&u.x>=0&&u.x<n&&u.y>=0&&u.y<returnreturn voidBFS(intx,inty);node;nowx=y=nowvu_ckoxy;while(!q.empty())now=if(ox==n-1&&y==n-1)for(inti=0;i<siz;printf("(%d,;}}for(inti=0;i<4;i)next.x=nowx+;next.y=y+;if(check(next)) next.v=;extvnowvsie(1].d=next.v.push_back(Road(next.x,next.y,-}}}}main()//freopen("in.txt","r",lag=n=memset(vis,0,for(inti=0;i<n;i+)for(intj=0;j<n;j+)scanf("%d",;}}BFS(0,return}#include#include#include5usingnamespaceconstintmaxn=100+8 int42]={{-1,0},{0,1},{1,0},{0,-bool;int; structNode int Node;19boolCheck(intx,int i(!a[][]&&!vis[x][y]&&x>=0&&x<5&&y>=0&&y< elsereturn voidprint(intif(m_queue[u].pre!=-printf("(%d, voidBFS(intx,intinthead=0,rear=m_ueuehe].x=_ehdy=m_qeehea]pre=-vis[x][]=while(head<for(inti=0;i<4;{intxx=m_ex+;intyy=mehd]y+;i[][]= = =_ure=;
if(xx==4&&yy==4)print(rear-
a//出}intn=;for(inti=0;i<n;{for(intj=0;j<n;{;}} return}1234567#include<iostream>#include<stdio.h>#include<string.h>#include<string>#include<vector>#include<stack>89namespaceintmaxn=;intNF=intn,k,ans=;inta[m[mxn]; bool; int42]={{-1,0},{0,1},{1,0},{0,-structnodeint ;; void{ ; ; 32boolCheck(intx,int if(!vis[x][y]&&ap]!=1&&x>=0&&x<n&&y>=0&& elsereturn voidDFS(intx,inty,intstep){//深刻理解遞歸的含nodenowx=y=;i(nowx==n-1noy==n-if(step<ans){//ans=; for(inti=0;i<4;{intxx=x+;intyy=nwy+;i[][]=DFS(xx,yy,step+vi[xx][y]=false;// s.pop();//反彈的時候重新還原 n=;for(inti=0;i<n;{for(intj=0;j<n;{;}}for(inti=icze)-1;i>=0;i--
printf("(%d,;
return//題目大意有一個正方形的戰場看,邊長為1000,西南方向在坐標原點,戰場上有n//解題思路:按照書上的思路,先判斷有無解,從上邊界開始DFS如果可以一直到//否則,也是從上邊界開始,dfs和東西邊界相連的圓(如果沒有就是#include#include#include#include#includeconstintmaxn=1000+constdoubleW=usingnamespacedoublex[n],[],;bool;intboolisinterect(intu,intv) returnsqrt((x[u]-x[v])*(x[u]-x[v])+(y[u]-y[v])*(y[u]-}voidcheck_circle(intu)if(x[u]<=r[u])Left=min(Left,y[u]-sqrt(r[u]*r[u]-if(x[u]+r[u]>=ht=min(Right,y[u]-sqrt(r[u]*-}booldfs(intu){檢查是否有if(vis[u]==true)returnviu]=if(y[u]<=r[u])return 以 相切都可for(inti=0;i<n;i)fiinetui)&&treturn}intmain()//freopen("in.txt","r",while(scanf("%d",n)!=EOF)memset(vis,false,Left=it=boollag=for(inti=0;i<n;i+),,;}for(inti=0;i<n;i+)if(y[i]+r[i]>=) if(dfs(i)){lag=false;break;//如果能夠從最上}}else}return}直接給出模板prim和kruskal(prim是堆優化的)//題目:#include#include#include 7usingnamespaceconstintmaxn=100+constintNF=;struct{intNodeNode(intv,int}booloperator<(constNode&rhs)constreturnhw< int;bool;int;voidfor(inti=0;i<an;] =for(inti=0;i<an;idi]=; intPrim(int;intans=NodeNow=q.top();intv=; ans+=;vis[v]=for(inti=1;i<=n;{intw2=;if(!vis[i]&&di]> i]= ; }}return}int;{;for(inti=1;i<=n;{Mapi]i]=for(intj=1;j<i;++)i]=a[i]=}for(inti=0;i<;{;if(c<Ma][])aa]=pba]=c;//注意重邊}}return}//題目:#include#include#include 7usingnamespaceconstintmaxn=1e5+int;voidfor(inti=0;i<=an;+)F]=for(inti=0;i<=an;ini]= intFind(int
returnFa[v]==v?v:Fa[v]=voidUnion(intx,intintfx=intfy=if(fx==if(Rank[fx]<Fa[fx]=Fa[fy]=if(Rank[fx]==; structint;Edge(intu,intv,int};intcmp(constvoid*a,constvoidEdge*aa=Edge*bb=returnaa->wbb->w1-1;// intkrusal(intn,int;intans=intcnt=for(inti=0;i<;{intu=;intv=;if(Find(u)!=;ans+=; if(cnt==n- return intint{ ;for(inti=0;i<;i+)]; return dijkstra,bellman_ford,floyd,12345#include<bits/stdc++.h>usingnamespacestd;constintmaxn=1e4+10;constintF=1e9;67struct{8int9Node(intv,int}booloperator<(const)constreturnrh.w<};bool;int;intvoidfor(inti=0;i<n;;for(inti=0;i<an;i]=for(inti=0;i<an;i)i]=}dijkstra(ints,inte){//傳入起點;d[s]=Nodenow=q.top();intv=;vis[v]=for(inti=0;i<G[]size);{intv2=;intw=;if(!vis[v2]&&d[v2]>{d[v2]=;;}}}return}int{for(inti=0;i<;{intx,y,scanf("%d%d%d",&x,&,;;};intans=if(INF!=elseprintf("-}return}#includeconstintmaxn=#defineNFusingnamespacebool;int;7voidDIJ(intn,ints)memset(flag,false,lags]=for(inti=0;i<n;lwi]=;for(inti=1;i<n;i+)intin=F,for(intj=0;j<n;if(!flag[j]&&in>o)in=;p= lag[p]=for(intj=0;j<n;if(!flag[j]&&lw[]>rap[p][]+)o[]=p[]+; intmain()intn,m,n,while(~scanf%d%",n,&m)for(inti=0;i<n;for(intj=0;j<n;if(i==rhi]=rhi]=for(inti=1;i<=;i+)intx,y,scanf("%d%d%d",&x,&,if(z<graph[x][y])graph[x][y]=graph[y][x]= n>>gin>>DIJ(n,;if(low[t]<)cout<<lo[]<<;
elsecout<<"-1"<<;
return#include#defineNFusingnamespaceconstintmaxn=vcorarint,int>;6intn,,voidinit()for(inti=0;i<an;;for(inti=0;i<n;i)is]= ints,while(cin>>n>>)for(inti=0;i<;i+)intx,y,n>>x>>y>>Edge[x].push_back(make_pair(y,Edge[y].push_back(make_pair(x, in>>s>> ;dis[s]=q.push(make_pair(-dist[s],while(!q.empty())intnow=for(inti=0;i<Edge[now].size();i+)intv=;if(dist[v]>is[o]+[noi)isv]=[no]+;q.push(make_pair(-dist[v],
if(dist[t]<Fut<<dis[]<<dl;elsecout<<"-1"<<nl;
return#include#definemaxn#defineNFusingnamespace6structEdgeintu,int; Edgeedge[maxn*13int;voidbellman_ford(ints,intn,int)for(inti=0;i<n;i+)is[i]=dis[s]=for(inti=0;i<n;for(intj=0;j<2*;ifiedej]u]>dis[edge[].v]+) ; intmain()intn,m,s,while(cin>>n>>)for(inti=0;i<;i+)scanf("%d%d%d",ee]u,&iv,;g[i+]v=;g[i+]u=;egi+wiht=; in>>s>> bellman_ford(s,n, if(dist[t]<N)cout<<is[]<<; elsecout<<"-1"<<;
return#include#definemaxn#defineNFusingnamespace6int;int;9voidfloyd(intn)for(intk=0;k<n;)for(inti=0;i<n;for(intj=0;j<n; = ahi] intmain()intn,m,s,while(cin>>n>>)for(inti=0;i<n;for(intj=0;j<n;if(i==rhi]=rhi]=for(inti=1;i<=;i+)intx,y,scanf("%d%d%d",&x,&,if(graph[x][y]>z)graph[x][y]=graph[y][x]= scanf("%d%d",,if(graph[s][t]<N)cout<<graph[s][t]<<;elsecout<<"-1"<<; return #include#definemaxn#defineNFusingnamespace6 int;8voidSPFA(ints,intn);memset(flag,false,for(inti=0;i<n;i+)is[i]=dis[s]=lags]=while(!q.empty())intep=lagemp]=for(inti=0;i<n;i+)if(dist[i]>s[tem]+ah[emp]i])disti]=isep]+;if(!flag[i]);lai]= intmain()intn,m,s,while(cin>>n>>)for(inti=0;i<n;for(intj=0;j<n;if(i==rhi]=rhi]=for(inti=0;i<;i+)intx,y,n>>x>>y>>if(z<graph[x][y])graph[x][y]=graph[y][x]=}in>>s>>SPFA(s,if(dist[t]<N)cout<<dis[]<<elsecout<<"-1"<<}return #include#defineNFusingnamespace5constintmaxn=vtr<rt,int>8intn,bool voidinit()i=i<;i=i<i++)i]=i=i<i)ist[i]=}ints,while(cin>>n>>)for(inti=0;i<;i+)intx,y,n>>x>>y>>Edge[x].push_back(make_pair(y,Edge[y].push_back(make_pair(x,}in>>s>>;dis[s]=lags]=while(!q.empty())intnow=no]=for(inti=0;i<Edge[now].size();i+)intv=;if(dist[v]>i[w]+){isv]=[no]+;if(lg[E]it);=}}}}if(dist[t]<NFcout<<];elsecout<<"-1"<<;}return}#includeusingnamespaceconstintmaxn=1e4+constintF=typedeflonglong6struct{intNode(intv,int}booloperator<(constde)constreturnrh.w<};bool; ;int;int;voidi=i<;i=i<i++visi]=i=i<i)i]=i=i<i++Pai]=1;//記錄路i=i< i=i< }voidPrintPath(intif(Pa[x]==-1)elseprintf("}}intdijkstra(ints,inte){//傳入起;d[s]=0,Pa[s]=-1,=]=Nodenow=q.top();intv=;vis[v]=for(inti=0;i<G[]size);{intv2=;intw=;if(!vis[v2]&&d[v2]>{ d[v2]=w+Toaleigh[v2]=Tlh]+;Pa[v2]=
olo]=oaoa];;
elseif(!vis[v2]&&d[v2]==v{if(TotalWeight[v2]<oleiv]+hv2]{//liv2]=oliv]+Wih;Pa[v2]=v;}ld]+=odv;//加上之前的條}}return}int;for(inti=0;i<n;;for(inti=0;i<;{;;;}intans=//if(INF!=ans)printf("%d\n",ans);elseprintf("-printf("%dreturn}和注意一下n個數的和//題目連接: #includeusingnamespaceconstintmaxn=100+5int(inta,intreturnb==:; 9intlcm(inta,intreturna/ intn(intv[],intif(n==1)return intnlcm(intv[],intif(n==1)returnreturnlcm(v[n-1],nlcm(v,n- intint;;while(n-- ;for(inti=0;i<;; ; return 埃拉托篩比較經典的快速篩素數,給個例題,用BFS#include#include usingnamespaceconstintmaxn=10000+int;bool;8//素數篩選的模板 intSieve(intn)intk=for(inti=0;i<=n;i++i_rei]=i0]=false,is_prime[1]=for(inti=2;i<=n;i)if(is_prime[i])ie+]=for(intj=i*i;j<=n;j+=i)is_prime[j]=false; return structNodeintNode(intv,int voidcut(intn,int intinex=while(n>a[index--]=n/= intrev(int ints=for(inti=0;i<4;i++s=s*10+return voidBFS(ints,intstep);Node;;vis[s]=while(!q.empty()) nv==e)lag=;return}int;for(inti=0;i<4;{;for(intj=0;j<=9;{[i]=next.v=if(next.v<10000&&>vvis[next.v]=next.step=;}}}}}main()inteean);//先把素數;while(T--)lag=;;if(flag==}return}//題目連接: #includeusingnamespaceconstintmaxn=5int;bool;8//素數篩選的模板 Sieve(intn)intk=for(inti=0;i<=n;i++i_rei]=i0]=false,is_prime[1]=for(inti=2;i<=n;i)if(is_prime[i])ie+]=for(intj=i*i;j<=n;j+=i)is_prime[j]=false;}}return}int;intln=;while(T--;int[a]k=for(inti=0;i<le;++){//唯一分while(n%ii]==ns[k+]=;n/=;}}for(inti=0;i<k;i++i==0?"%d":}return}擴展幾里基本算法:對于不完全為0的非負整數a,b,(a,b)表示a,b的最大公約數,必然存在整數對x,y,使得(a,b)=ax+by。,具體用處在于:#include3 intex(inta,intb,int&int if(b== x= y=return intd=ex; //d就
intt=x;x=y;returnd;boollinear_equation(inta,intb,intc,intt{intd=ex (a,b)//求出a*x+b*y printf("%d*x+
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 紡織品批發商客戶關系管理考核試卷
- 珠寶首飾設計與生活美學融合考核試卷
- 礦用通訊設備與網絡技術考核試卷
- 玻璃制品耐候性能測試考核試卷
- 娛樂用品生產設備智能化改造與升級考核試卷
- 牛只生長發育與飼養管理優化考核試卷
- 玻璃加工過程中的污染控制考核試卷
- 建筑裝飾工程信息模型(BIM)應用考核試卷
- 嶺南師范學院《工程造價算量信息化綜合》2023-2024學年第一學期期末試卷
- 寧夏醫科大學《器官-系統模塊三》2023-2024學年第二學期期末試卷
- 煤礦管理人員事故隱患排查治理專項培訓課件
- 2024年重慶高考物理卷試題真題解讀及答案詳解(精校打印)
- 水族館節能減排策略-洞察分析
- 居間合同協議書范本標準版
- 2024年孝感市(中心)人民醫院高層次衛技人才招聘筆試歷年參考題庫頻考點附帶答案
- VL3000系列高性能矢量型變頻器用戶手冊上海沃陸電氣有限公司
- 極端天氣應急
- 家具采購安裝方案、家具采購服務方案和計劃
- 2023年中國計量科學研究院招聘筆試真題
- 影視產業人才培養-洞察分析
- 兒童系統性紅斑狼瘡診斷與治療評析
評論
0/150
提交評論