1、 int num3838 ; void Zreo() memset(num,0,sizeof(num) ; void dig_One() for(int i=1;i=n;i+) numii=1 ;int Mod ;Mat add(Mat A, Mat B) Mat ans ; for(int j=1;jj+) ans.numij=(A.numij+B.numij)%Mod ; return ans ;Mat mult(Mat A,Mat B) ans.Zreo() ; for(int k=1;k=1) if(y&1) ans=mult(ans,x) ; x=mult(x,x) ;Mat A ;
2、 /全局变量Mat get_sum(int k) /计算A+A2+A3+.+AK if(k=1) return A ; else if(k& return add(get_sum(k-1),my_pow(A,k) ; else Mat B=get_sum(k1) ; return add(B , mult(B,my_pow(A,k1) ;【KM二分最佳匹配】const int size=10008 ;const int inf=100000000;int gridsizesize ;int lxsize ,lysize ;int n ,m ; /n ,m 集合X ,Y的元素个数bool vis
3、ited_xsize ,visited_ysize ;int matchsize ;bool dfs(int u) visited_xu=1; for(int v=1;v=m;v+) if(!visited_yv&lxu+lyv=griduv) visited_yv=1 ; if(matchv=-1|dfs(matchv) matchv=u ; return 1; return 0;int KM(int type) /type=0最小权值匹配 ,type=1最大权值匹配 int i ,j ,k ,sum=0; if(type=0) for(i=1; for(j=1; gridij=-gridi
4、j ; memset(ly,0,sizeof(ly) ;i+) lxi=-inf ; lxi=max(lxi,gridij) ; memset(match,-1,sizeof(match) ; while(1) memset(visited_x,0,sizeof(visited_x) ; memset(visited_y,0,sizeof(visited_y) ; if(dfs(k) break ; int d=inf ; if(visited_xi)j+)visited_yj) d=min(d,lxi+lyj-gridij) ; if(d=inf) return -1 ; if(visite
5、d_xi) lxi-=d; if(visited_yi) lyi+=d; if(matchi!=-1) sum+=gridmatchii ; return type?sum:-sum ;【spfa() 差分约束系统】 /加入超级大原点const int size=1008 ;struct Edge int v ; int w ; int next ;edge2*10008 ;int vecsize ,id, in_timesize ,distsize;const int inf=INT_MAX ;inline void add_edge(int u ,int v ,int w) edgeid.
6、v=v ; edgeid.w=w ; edgeid.next=vecu ; vecu=id+ ;void init() memset(vec,-1,sizeof(vec) ; id=0 ; memset(in_time,0, sizeof(in_time) ;bool in_quesize;int spfa(int s) int i , j ,u, v; disti=inf ,in_quei=0; dists=0 ; in_ques=1 ; in_times+ ; queueque ; que.push(s) ; while(!que.empty() u=que.front() ; que.p
7、op() ; in_queu=0 ; for(int e=vecu; e!=-1 ;e=edgee.next) v=edgee.v ; if(distvdistu+edgee.w) distv=distu+edgee.w ;in_quev) in_quev=1 ; in_timev+ ; if(in_timevn) /必须 que.push(v) ; return distn=inf?-2:distn ;int main() int i ,ml, md ,a, b ,w; scanf(%d%d%d,&n,&ml,&md) ; init() ;=ml;a,&b,&w) ; add_edge(a,
8、b,w) ;=md; add_edge(b,a,-w) ; printf(%dn,spfa(1) ; return 0 ;【tarjan算法 缩点最长路】using namespace std ;const int size=150010 ;struct EDGEedgesize ;int id ;int vecsize ,mystacksize ,top;int lowsize ,dfnsize ,idx ,num ;bool instacksize ;int belongsize ;inline void add_edge(int u,int v)int sumsize ;int s,st
9、art ;void tarjan(int u) lowu=dfnu=idx+ ; mystack+top=u ; instacku=1 ;e!=-1; int v=edgee.v ; if(dfnv=-1) tarjan(v) ; lowu=min(lowu,lowv) ; else if(instackv) lowu=min(lowu,dfnv) ; if(lowu=dfnu) num+ ; do v=mystacktop- ; instackv=0 ; belongv=num ; if(v=s) start=num ; sumnum+ ; while(v!=u) ; idx=1 ; top
10、=-1 ; num=0 ; id=0; memset(dfn,-1,sizeof(dfn) ; memset(instack,0,sizeof(instack) ; memset(sum,0,sizeof(sum) ;struct NEWEDGEnew_edgesize ;int new_linksize ,new_id;inline void add_new_edge(int u,int v) new_edgenew_id.v=v ; new_edgenew_id.next=new_linku ; new_linku=new_id+ ;int distsize ; int i ,j ,m,u
11、,v,cas=1; while(scanf(m,&s)!=EOF) while(m-)%d%du,&v) ; if(u=v) continue ; add_edge(u,v) ; if(dfni=-1) tarjan(i) ; disti=0 ; new_id=0 ; memset(new_link,-1,sizeof(new_link) ; for(u=1;uu+) if(belongu!=belongv) add_new_edge(belongu,belongv) ; int visitedsize ; memset(visited,0,sizeof(visited) ; que.push
12、(start) ; diststart=sumstart ; visitedstart=1 ; int ans=diststart; visitedu=0 ; for(int e=new_linku;e=new_edgee.next) v=new_edgee.v ; if(distvdistu+sumv) distv=distu+sumv ; ans=max(ans,distv) ;visitedv)Case %d:n,cas+) ;,ans) ;【二分图判定/黑白染色】 int v; int next;edge2000010;int color1010;int vec1010;int n,m
13、,id,flag;inline void addedge(int u,int v) edgeid.v=v; edgeid.next=vecu; vecu=id; id+;void dfs(int u,int color_type) coloru=color_type; int v=edgee.v; if(colorv=0) dfs(v,3-color_type); else if(colorv=coloru) flag=0; return ; int t,i,j,u,v,cas;%dt); for(cas=1;casy) swap(x,y) ; girli.left=x ; girli.rig
14、ht=y;boyi) ; memset(grid,0,sizeof(grid) ; if(girli.left=boyj&boyj=girli.right) gridij=1 ;,max_match() ;【mapstring,string手写】struct node char name25; char fun85; friend bool operator(const node &a,const node &b) return strcmp(a.name,b.name)0;namesN;int k;int find_name(char *name) int left=0,right=k-1,
15、mid; while(left1; if(strcmp(namesmid.name,name)=0) return mid; else if(strcmp(namesmid.name,name)0) right=mid-1; else if(strcmp(namesmid.name,name)eps) mid=(left+right)/2.0 ; if(fabs(SUM_AGE(mid)-two_PI)two_PI) right=mid; else left=mid ; ,cas) ; if(fabs(SUM_AGE(ans)-two_PI)y?x:y ;double judge(double r) double len=2.0*r*sin(PI/n) ; int i ; if(sidei+sidei+1len) return 4.0*PI ; double temp =(sidei*sidei+sidei+1*sidei+1-le
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2