锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
{
long t;
if(n==0) return 1%b;
if(n==1) return a%b;
t=exp_mod(a,n/2,b);
t=t*t%b;
if((n&1)==1) t=t*a%b;
return t;
}
]]>
#define maxn 507
#define INF 200000007
FILE *fin=fopen("data.in","r"),*fout=fopen("data.out","w");
typedef struct
{
long count,front,rear,item[maxn];
}queue;
void Clear(queue &q)
{
q.count=0;q.front=0;q.rear=-1;
}
void Push(queue &q,long x)
{
q.count++;q.rear++;
if(q.rear>=maxn) q.rear=0;
q.item[q.rear]=x;
}
void Pop(queue &q,long &x)
{
q.count--;x=q.item[q.front];
q.front++;
if(q.front>=maxn) q.front=0;
}
bool Empty(queue &q)
{
return (q.count==0);
}
long n,m,cap[maxn][maxn],cost[maxn][maxn];
long s,t,minc,maxf,flow[maxn][maxn];
long min(long a,long b)
{return (a<b?a:b);}
void input()
{
fscanf(fin,"%ld%ld",&n,&m);
for(long i=1;i<=n;i++)
for(long j=1;j<=n;j++)
{
cap[i][j]=0;cost[i][j]=INF;
}
for(long i=1;i<=m;i++)
{
long a,b,c,d;
fscanf(fin,"%ld%ld%ld%ld",&a,&b,&c,&d);
cap[a][b]=c;cost[a][b]=d;
}
}
void Mincost_Maxflow()
{
long tmp,d[maxn],father[maxn];
bool inq[maxn];
queue q;Clear(q);
s=1;t=n;
for(long i=1;i<=n;i++)
for(long j=1;j<=n;j++)
flow[i][j]=0;
minc=0;maxf=0;
while(true)
{
for(long i=1;i<=n;i++)
{
d[i]=(i==s?0:INF);
father[i]=0;
inq[i]=false;
}
d[s]=0;Push(q,s);inq[s]=true;
while(!Empty(q))
{
long i;Pop(q,i);inq[i]=false;
for(long j=1;j<=n;j++)
if(cap[i][j]>flow[i][j]&&cost[i][j]<INF&&d[i]+cost[i][j]<d[j])
{
d[j]=d[i]+cost[i][j];
father[j]=i;
if(!inq[j])
{Push(q,j);inq[j]=true;}
}
}
if(d[t]>=INF) break;
tmp=INF;
for(long i=t;i!=s;i=father[i]) tmp=min(tmp,cap[father[i]][i]-flow[father[i]][i]);
for(long i=t;i!=s;i=father[i])
{
flow[father[i]][i]+=tmp;
flow[i][father[i]]-=tmp;
}
minc+=tmp*d[t];
maxf+=tmp;
}
}
void output()
{
fprintf(fout,"Mincost := %ld\nMaxflow := %ld\n",minc,maxf);
}
int main()
{
input();
Mincost_Maxflow();
output();
return 0;
}
]]>
insert(a,b)錛氬湪閾捐〃涓間負b鐨勫厓绱犲墠闈㈡彃鍏錛屽鏋滄壘涓嶅埌b錛屽皢a鎻掑叆閾捐〃鏈錛?br>print()錛氶亶鍘嗘暣涓摼琛紝騫惰緭鍑恒?br>
#include<string.h>
#define maxn 1007
long n,a[maxn],next[maxn];
void insert(long x,long y)
{
long p=0;
n++;a[n]=x;
while(next[p]&&a[next[p]]!=y)
p=next[p];
next[n]=next[p];
next[p]=n;
}
void print()
{
long p=next[0];
bool first=true;
while(p)
{
if(first) first=false;
else printf(" ");
printf("%ld",a[p]);
p=next[p];
}
}
int main()
{
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
long m,a,b;
char cmd[maxn];
n=0;
memset(next,0,sizeof(next));
scanf("%ld",&m);
while(m--)
{
scanf("%s",cmd);
if(cmd[0]=='I')
{
scanf("%ld%ld",&a,&b);
insert(a,b);
}
else
{
print();putchar('\n');
}
}
return 0;
}
]]>
#define maxn 10007
typedef struct
{
long data,fa,ls,rs;
}Node;
Node splay[maxn];
long m,root;
long n;
void Zig(long node)
{
long t=splay[node].fa;
splay[t].rs=splay[node].ls;
if(splay[node].ls)
splay[splay[node].ls].fa=t;
splay[node].fa=splay[t].fa;
splay[node].ls=t;
if(splay[t].fa)
{
if(t==splay[splay[t].fa].ls) splay[splay[t].fa].ls=node;
else splay[splay[t].fa].rs=node;
}
splay[t].fa=node;
}
void Zag(long node)
{
long t=splay[node].fa;
splay[t].ls=splay[node].rs;
if(splay[node].rs)
splay[splay[node].rs].fa=t;
splay[node].fa=splay[t].fa;
splay[node].rs=t;
if(splay[t].fa)
{
if(t==splay[splay[t].fa].ls) splay[splay[t].fa].ls=node;
else splay[splay[t].fa].rs=node;
}
splay[t].fa=node;
}
void Splay(long node)
{
long t;
while(splay[node].fa)
{
t=splay[node].fa;
if(splay[t].fa==0)
{
if(node==splay[t].ls) Zag(node);
else Zig(node);
break;
}
if(t==splay[splay[t].fa].ls)
{
if(node==splay[t].ls)
{Zag(t);Zag(node);}
else {Zig(node);Zag(node);}
}
else
{
if(node==splay[t].ls)
{Zag(node);Zig(node);}
else {Zig(t);Zig(node);}
}
}
root=node;
}
void Insert(long x)
{
long p,q;
m++;
splay[m].data=x;
splay[m].fa=splay[m].ls=splay[m].rs=0;
if(root==0)
{
root=m;return;
}
for(p=root;p; )
{
q=p;
if(x<=splay[p].data) p=splay[p].ls;
else p=splay[p].rs;
}
splay[m].fa=q;
if(x<=splay[q].data) splay[q].ls=m;
else splay[q].rs=m;
Splay(m);
}
int main()
{
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
scanf("%ld",&n);
m=root=0;
for(long i=1;i<=n;i++)
splay[i].data=splay[i].fa=splay[i].ls=splay[i].rs=0;
for(long i=1;i<=n;i++)
{
long t;
scanf("%ld",&t);
Insert(t);
}
Splay(1);
for(long i=1;i<=n;i++)
printf("No.%ld data.%ld fa.%ld ls.%ld rs.%ld\n",i,splay[i].data,splay[i].fa,splay[i].ls,splay[i].rs);
return 0;
}
]]>
#include<stdlib.h>
#include<time.h>
#define maxTest 5
typedef long long int64;
int64 random(int64 n)
{
return (int64)((double)rand()/RAND_MAX*n+0.5);
}
int64 mod_exp(int64 a,int64 b,int64 n)
{
long ans;
if(b==1) return a%n;
ans=mod_exp(a,b/2,n);
if(b%2==0) return ans*ans%n;
else return ans*ans%n*a%n;
}
bool miller_rabbin(int64 n)
{
for(long i=1;i<=maxTest;i++)
{
long a=random(n-2)+1;
if(mod_exp(a,n-1,n)!=1) return false;
}
return true;
}
int main()
{
/*
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
//*/
srand(time(NULL));
int64 n;
while(scanf("%I64d",&n)==1)
if(miller_rabbin(n))
printf("True\n\n");
else printf("False\n\n");
return 0;
}
]]>
Author >> Lee1R
Time >> 02,16,2010 23:37
//*/
#include<stdio.h>
const long maxn=10007;
typedef struct NODE
{
long a,b,sum;
long left,right;
}node;
long n,m,a[maxn];
node tree[maxn];long tot;
void creat(long begin,long end)
{
long now,mid=(begin+end)/2;
tot++;now=tot;
tree[now].a=begin;tree[now].b=end;
if(end-begin<=1)
{
tree[now].left=-1;
tree[now].right=-1;
tree[now].sum=a[begin]+a[end];
}
else
{
tree[now].left=tot+1;creat(begin,mid);
tree[now].right=tot+1;creat(mid,end);
tree[now].sum=tree[tree[now].left].sum+tree[tree[now].right].sum-a[mid];
}
}
void add(long pos,long det,long node)
{
long begin=tree[node].a,end=tree[node].b,mid=(begin+end)/2;
tree[node].sum+=det;
if(end-begin==1) return;
if(pos>=begin&&pos<=mid)
add(pos,det,tree[node].left);
if(pos>=mid&&pos<=end)
add(pos,det,tree[node].right);
}
long getsum(long begin,long end,long node)
{
long re=0,t=(tree[node].a+tree[node].b)/2;
if(tree[node].b-tree[node].a==1) re=tree[node].sum;
else
{
if(end<=t)
re=getsum(begin,end,tree[node].left);
else if(begin>=t)
re=getsum(begin,end,tree[node].right);
else
re=getsum(begin,t,tree[node].left)+getsum(t,end,tree[node].right)-a[t];
}
return re;
}
int main()
{
//*
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
//*/
scanf("%ld",&n);
for(long i=1;i<=n;i++) scanf("%ld",&a[i]);
tot=0;creat(1,n);
// Init
scanf("%ld",&m);
for(long i=1;i<=m;i++)
{
long t,b,c;
scanf("%ld%ld%ld",&t,&b,&c);
switch(t)
{
case 1:
a[b]+=c;
add(b,c,1);
break;
case 2:
if(b==c) printf("%ld\n",a[b]);
else printf("%ld\n",getsum(b,c,1));
break;
}
}
return 0;
}
]]>
for(long i=1;i<=n;i++)
for(long j=1;j<=n;j++)
if(k!=i&&i!=j&&j!=k)
d[i][j]=min(d[i][j],d[i][k]+d[k][j])
]]>
const long maxn=107,INF=10000007;
typedef struct
{
long u,v,w;
}edge;
long n,m,g[maxn][maxn],mst;
edge E[maxn*maxn];
long f[maxn];
long Getf(long x)
{
if(f[x]==x) return x;
f[x]=Getf(f[x]);
return f[x];
}
bool Judge(long x,long y)
{
return (Getf(x)==Getf(y));
}
void Union(long x,long y)
{
long i=Getf(x),j=Getf(y);
if(i==j) return ;
f[i]=j;
}
void Qsort(edge *a,long begin,long end)
{
long i=begin,j=end,mid=a[(begin+end)/2].w;
edge t;
do{
while(a[i].w<mid) i++;
while(a[j].w>mid) j--;
if(i<=j)
{
t=a[i];a[i]=a[j];a[j]=t;
i++;j--;
}
}while(i<=j);
if(begin<j) Qsort(a,begin,j);
if(i<end) Qsort(a,i,end);
}
int main()
{
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
scanf("%ld%ld",&n,&m);
for(long i=1;i<=n;i++)
for(long j=1;j<=n;j++)
g[i][j]=INF;
for(long i=1;i<=m;i++)
scanf("%ld%ld%ld",&E[i].u,&E[i].v,&E[i].w);
// Read In
Qsort(E,1,m);
// Qsort
for(long i=1;i<=n;i++) f[i]=i;
// Init
mst=0;
long i=0,j=1;
while(i<n-1)
{
long a=E[j].u,b=E[j].v;
if(!Judge(a,b))
{
mst+=E[j].w;
Union(a,b);
i++;
}
j++;
}
printf("%ld\n",mst);
return 0;
}
]]>
typedef struct
{
long front,rear,count,item[maxn];
}queue;
void clear(queue &q)
{
q.count=0;
q.front=0;
q.rear=-1;
}
bool empty(queue &q)
{
return (q.count==0);
}
void put(queue &q,long x)
{
q.rear++;
q.item[q.rear]=x;
q.count++;
}
void get(queue &q,long &x)
{
x=q.item[q.front];
q.front++;
q.count--;
}
]]>
const long maxn=1007;
typedef struct
{
long top,count,item[maxn];
}stack;
void clear(stack &q)
{
q.count=0;
q.top=-1;
}
bool empty(stack &q)
{
return (q.count==0);
}
void push(stack &q,long x)
{
q.top++;
q.item[q.top]=x;
q.count++;
}
void pop(stack &q,long &x)
{
x=q.item[q.top];
q.top--;
q.count--;
}
int main()
{
stack s;clear(s);
for(long i=1;i<=10;i++) push(s,i);
while(!empty(s))
{
long x;
pop(s,x);
printf("%ld\n",x);
}
getchar();
return 0;
}
]]>
const long maxn=107,INF=2000007;
typedef struct
{
long front,rear,count,item[maxn];
}queue;
void clear(queue &q)
{
q.count=0;
q.front=0;
q.rear=-1;
}
bool empty(queue &q)
{
return (q.count==0);
}
void push(queue &q,long x)
{
q.rear++;
q.item[q.rear]=x;
q.count++;
}
void pop(queue &q,long &x)
{
x=q.item[q.front];
q.front++;
q.count--;
}
// Queue
long n,m,cap[maxn][maxn],flow[maxn][maxn];
long s,t,fmax;
long min(long a,long b)
{
return (a<b?a:b);
}
void read()
{
scanf("%ld%ld",&n,&m);
s=1;t=n;
for(long i=1;i<=n;i++)
for(long j=1;j<=n;j++)
cap[i][j]=0;
for(long i=1;i<=m;i++)
{
long a,b,w;
scanf("%ld%ld%ld",&a,&b,&w);
cap[a][b]=w;
}
}
void EK()
{
long tmp[maxn],father[maxn];
queue q;clear(q);
for(long i=1;i<=n;i++)
for(long j=1;j<=n;j++)
flow[i][j]=0;
fmax=0;
while(true)
{
for(long i=1;i<=n;i++) tmp[i]=father[i]=0;
tmp[s]=INF;
push(q,s);
while(!empty(q))
{
long i;
pop(q,i);
for(long j=1;j<=n;j++)
if(!tmp[j]&&cap[i][j]>flow[i][j])
{
tmp[j]=min(tmp[i],cap[i][j]-flow[i][j]);
father[j]=i;
push(q,j);
}
}
if(tmp[t]==0) break;
for(long i=t;i!=s;i=father[i])
{
flow[father[i]][i]+=tmp[t];
flow[i][father[i]]-=tmp[t];
}
fmax+=tmp[t];
}
printf("%ld\n",fmax);
}
int main()
{
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
read();
EK();
return 0;
}
]]>
high_search()鍔熻兘錛氬湪鏈夊簭鏁扮粍a鐨刐begin,end)鍖洪棿涓彃鍏ヤ竴涓暟瀛梮錛寈灝介噺鍚戝悗鎻掑叆錛岃繑鍥瀤搴旇鎻掑叆鐨勪綅緗?br>浠ヤ笅鏄垜鐨勪唬鐮侊細
long bsearch(long *a,long begin,long end,long x)
{// [begin,end)
long mid;
while(begin<end)
{
mid=(begin+end)/2;
if(a[mid]==x) return mid;
else if(a[mid]>x) end=mid;
else begin=mid+1;
}
return 0;
}
long low_search(long *a,long begin,long end,long x)
{
long mid;
while(begin<end)
{
mid=(begin+end)/2;
if(a[mid]>=x) end=mid;
else begin=mid+1;
}
return begin;
}
long high_search(long *a,long begin,long end,long x)
{
long mid;
while(begin<end)
{
mid=(begin+end)/2;
if(a[mid]<=x) begin=mid+1;
else end=mid;
}
return begin;
}
int main()
{
//*
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
//*/
const long maxn=108;
long n=0,a[maxn];
while(scanf("%ld",&a[n+1])==1) n++;
return 0;
}
]]>
void msort(long *a,long *t,long begin,long end)
{
long mid=(begin+end)/2,p=begin,q=mid+1,i=begin;
if(begin<end)
{
msort(a,t,begin,mid);
msort(a,t,mid+1,end);
while(i<=end)
{
if(q>end||a[p]<=a[q]) t[i++]=a[p++];
else t[i++]=a[q++];
}
for(long i=begin;i<=end;i++) a[i]=t[i];
}
}
int main()
{
//*
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
//*/
const long maxn=108;
long n=0,a[maxn],t[maxn];
bool first=true;
while(scanf("%ld",&a[n+1])==1) n++;
// Read In
msort(a,t,1,n);
// M_sort
for(long i=1;i<=n;i++)
{
if(first) first=false;
else printf(" ");
printf("%ld",a[i]);
}
putchar('\n');
return 0;
}
鍦ㄤ笂闈㈢殑褰掑茍鎺掑簭紼嬪簭鐨勫熀紜涓婏紝寰堝鏄撲慨鏀瑰緱鍑烘眰涓涓簭鍒楅嗗簭瀵逛釜鏁扮殑紼嬪簭銆?br>浠ヤ笅鏄垜鐨勪唬鐮侊紝鍙粰鍑哄嚱鏁幫紝main()涓庝笂闈㈢殑鍩烘湰鐩稿悓錛?br>
{
long mid=(begin+end)/2,p=begin,q=mid+1,i=begin,re=0;
if(begin<end)
{
re+=count(a,t,begin,mid);
re+=count(a,t,mid+1,end);
while(i<=end)
{
if(q>end||a[p]<=a[q]) t[i++]=a[p++];
else
{
t[i++]=a[q++];
re+=mid-p+1;
}
}
for(long i=begin;i<=end;i++) a[i]=t[i];
}
return re;
}
]]>
1銆?/span>鏃跺埢淇濇寔鍐烽潤鐨勫ご鑴戯紱
2銆?/span>涓嶈鏄粈涔堥鐩紙鍋氳繃鎴栨槸娌″仛榪囷紝姘撮鎴栭毦棰橈級錛岄兘瑕佷粩緇嗛槄璇婚鐩紱
3銆?/span>寮濮嬬紪鐮佷箣鍓嶏紝鍏堝啓鍑虹▼搴忓ぇ綰詫紝鍐欏嚭闇瑕佺紪鍐欑殑鍑芥暟錛?/span>
4銆?/span>灝介噺涓嶈浣跨敤鍏ㄥ眬鍙橀噺錛堢壒鍒槸鐢ㄤ簬寰幆鐨勫彉閲忥級錛屼竴瀹氶伩鍏嶅彉閲忛噸鍚嶏紱
5銆?/span>鎼滅儲鏃訛紝璁捐鐨勫壀鏋濈瓥鐣ユ棤娉曞嚭瑙f椂錛屽湪淇濊瘉姝g‘鎬х殑鎯呭喌涓嬶紝閫傚綋鏀懼鎼滅儲鏉′歡錛?/span>
6銆?/span>鍔ㄦ佽鍒掓椂錛屼竴瀹氭椂鍒繪槑紜姸鎬佺殑瀹氫箟錛岀‘瀹氳竟鐣屾潯浠訛紱
7銆?/span>妯℃嫙鏃訛紝鐞嗘竻閫昏緫鍏崇郴錛?/span>
8銆佸湪涓嶅獎鍝嶇粨鏋滅殑鏃跺欙紝鍑芥暟璋冪敤鍙互浣跨敤鍦板潃浼犻掞紝鏁堢巼杈冮珮銆?/font>
Ps錛?/font>
1.瀵瑰爢鐨勮皟鏁翠粠欏惰嚦涓嬭繘琛屻?/font>
2.鍒涘緩涓涓柊鍫嗗簲璇ヤ粠鏈鍚庝竴涓彾緇撶偣鐨勭埗緇撶偣寮濮嬮愭鍚戜笂璋冩暣銆?/font>
3.瀵筯eap[s..m]鑳藉璋冩暣鎴愬姛錛岄渶瑕乭eap[s+1..m]涓ユ牸婊¤凍鍫嗙殑瀹氫箟銆?/font>
瀵逛簬鐜艦鐨勫姩鎬佽鍒掞紝
鍙互鎶婃暟緇勪笅鏍囧鍒朵竴浠界劧鍚庤繘琛屽姩鎬佽鍒?/font>
//------------------------------------------------------------
鍦ㄥ姩鎬佽鍒掔殑鍏蜂綋緙栫▼涓紝鍙兘璁稿鏃跺欏啓鍑轟簡姝g‘鐨勭姸鎬佽漿縐繪柟紼嬶紝浣嗙紪鍐欏悗鐨勭▼搴忓嵈寰椾笉鍒版紜В錛岃繖寰堟湁鍙兘鏄洜涓哄姩鎬佽鍒掔殑寰幆鐨勯『閫嗗簭錛屾垨鑰呭驚鐜殑鍐呭灞傚嚭鐜頒簡閿欒銆?/font>
鍦ㄨ繖閲屽拷鐣ュ叾浠栬祫鏂欎腑鐨勭悊璁虹煡璇嗭紝鑰屽叿浣撹鍔ㄦ佽鍒掓槸濡備綍瀹炵幇鐨勩?/font>
// 鍦ㄨ繖閲岀殑緇欏嚭鐨勫叏閮ㄤ唬鐮侀兘娌℃湁緇忚繃璋冭瘯鑰岀洿鎺ュ啓鍑?/span>
// 濡傛灉鍑虹幇閿欒錛岃鎸囧嚭
浠?/span>01鑳屽寘寮濮嬭璧楓?/span>
紼嶅井鎺屾彙鍔ㄦ佽鍒掔殑浜洪兘鍙互鐔熺粌鍦板啓鍑哄涓嬩唬鐮侊細
涓鑸殑鍔ㄦ佽鍒掗兘鏄厛鏋氫婦鐘舵佸啀鏋氫婦鍐崇瓥錛屽彲鑳藉垵瀛﹁呬笉鏄庣櫧浠ヤ笂鐨勪唬鐮佹槸鎬庝箞鍥炰簨錛屽洜涓鴻繖鏄檷緇翠箣鍚庣殑鐘舵佽〃紺猴紝闄嶇淮涔嬪墠鐨勬槸錛?/font>
d[i][j]=max(d[i-1][j],d[i-1][j-c[i]]+w[i])錛?/span>
涔嬫墍浠ュ彲浠ラ檷緇存槸鍥犱負錛氳瀵熺姸鎬佽漿縐繪柟紼嬶紝絎?/span>i嬈$殑鍐崇瓥鍙笌絎?/span>i-1嬈℃墍璁板綍鐨勭姸鎬佹湁鍏籌紝浜庢槸鎯籌紝鑳戒笉鑳芥湁涓縐嶆柟娉曞彧鐢ㄤ竴緇存暟緇勶紝灝卞彲浠ュ湪鐘舵佽漿縐昏兘澶熸紜繘琛岋紵絳旀鏄偗瀹氱殑錛岄偅灝辨槸絎簩灞備嬌鐢ㄩ嗗簭寰幆銆?/span>
NOIp 2006 閲戞槑鐨勯綆楁柟妗?/span>
鍏堝鐞嗕竴涓嬬粰鍑虹殑鐗╁搧錛屽垎鎴愯嫢騫茬粍錛岃漿鍖栦負鍒嗙粍鑳屽寘闂銆?/font>
鍐欏嚭鍒嗙粍鑳屽寘鐨勭姸鎬佽漿縐繪柟紼嬶細
d[k][j]=max(d[k-1][j],d[k-1][j-c[k][i]]+w[k][i])錛?/span>
瀵逛簬鍒嗙粍鑳屽寘錛岀粰鍑哄涓嬩唬鐮侊細
// 銆婅儗鍖呴棶棰樹節璁層嬩腑鐨勪唬鐮佷技涔庢湁鐐歸敊璇?/span>
鍚屾牱錛屽厛瑙傚療鐘舵佽漿縐繪柟紼嬶紝榪樻槸鍙彇鍐充簬絎?/span>k-1緇勮褰曠殑鐘舵侊紝鍙堣浣挎瘡緇勪腑鐗╁搧鍙変竴浠舵垨鑰呬竴浠墮兘涓嶉夈傝繖鏍峰氨紜畾浜嗗垎緇勮儗鍖呭彧鑳芥槸涓婇潰鐨勫驚鐜搴忥紝鍥犱負鍙湁榪欐牱鍦ㄧk緇勫喅絳栫殑鏃跺欐墠鑳戒繚璇佷粠絎?/span>k-1緇勭殑鐘舵佽漿縐昏屾潵錛涚畝鍗曞湴璇村氨鏄紝鍦ㄧ浜屽眰鍥哄畾浜嗗墠k緇勭墿鍝佸崰鐢ㄧ殑絀洪棿錛岄偅涔堟棤璁洪夋嫨鍝竴涓?/span>i錛屾渶緇堣繖涓姸鎬侀兘鍙兘琚k緇勭殑涓涓墿鍝佸崰鐢紱璇曟兂濡傛灉鍍忋婅儗鍖呴棶棰樹節璁層嬩腑閭f牱鎶婄浜屽眰寰幆鍜岀涓夊眰寰幆棰犲掕繃鏉ワ紝閭d箞灝辨湁鍙兘絎?/span>k灞傜殑鐘舵佺敱絎?/span>k灞傜殑鐘舵佽漿縐昏屾潵錛屼粠鑰屼笉鑳戒繚璇佹渶澶氶夋嫨涓浠剁墿鍝併?/span>
Vijos GF
浜岀淮璐圭敤鐨勮儗鍖呫?/font>
鐘舵佽漿縐繪柟紼嬬洿鎺ョ粰鍑哄涓嬶細
d[i][j][k]=max(d[i-1][j][k],d[i-1][j-c1[i]][k-c2[i]]+w[i])錛?/span>
鍚屾牱鍙互闄嶅埌浜岀淮錛屽洜涓烘槸姣忎釜GF鍙兘閫夋嫨涓嬈★紙棰樼洰涓ソ鍍忔病鏈夎繖涔堣錛屽緢涔呬箣鍓嶅仛鐨勪簡錛屼笉澶寰椾簡錛屼絾鏄幇瀹炵敓媧諱腑鐨勭粡楠屽憡璇夋垜浠瘡涓?/span>GF鍙兘閫夋嫨涓嬈★級錛屾墍浠ュ湪寰幆鏋氫婦j鍜?/span>k鐨勬椂鍊欒浣跨敤閫嗗簭銆?/span>
Vijos 鎯呮晫
褰撶劧鍙互鐞嗚В涓哄拰“閲戞槑鐨勯綆楁柟妗?#8221;涓鏍鳳紝鏄湁渚濊禆鍏崇郴鐨勮儗鍖呴棶棰橈紝浣嗘槸榪欓亾棰樺嵈鍦ㄦ暟鎹殑瑙勬ā涓婂憡璇夋垜浠敤閭g鏂規硶鏄笉鍙鐨勩傛洿濂界殑鍋氭硶鏄悳绱㈠拰鍔ㄦ佽鍒掔粨鍚堬紝姣忔鏋氫婦瓚呯駭鎯呮晫鍦ㄧ涓涓湀娑堢伃銆佺浜屼釜鏈堟秷鐏佺涓変釜鏈堟秷鐏紙鍗充笉娑堢伃錛夛紝鐒跺悗瀵瑰叾浣欐儏鏁岃繘琛屽姩鎬佽鍒掋?/font>
鐪佺暐鎼滅儲閮ㄥ垎錛岃岀潃閲嶈璇村姩鎬佽鍒掋?/font>
鐘舵佽漿縐繪柟紼嬶細
d[i][j][k]=max(d[i-1][j][k],d[i-1][j-c1[i]][k],d[i-1][j][k-c2[i]])錛?/span>
鐢變簬鏈夊彲鑳芥煇涓秴綰ф儏鏁屾病鏈夎娑堢伃錛岃屽湪鏋氫婦i鐨勬椂鍊欐灇涓句簡榪欎釜瓚呯駭鎯呮晫錛屽鏋滃湪榪欐椂鐩存帴鍒ゆ柇鍚?/span>continue錛屽彲鑳介犳垚d[i]灞傜殑絀虹己錛屼互鑷充簬d[i+1]灞傜殑閿欒銆傛墍浠ュ湪澶勭悊榪欐牱鍙兘鍑虹幇鏌愪竴灞傚嚭鐜扮┖緙虹殑鎯呭喌鏃訛紝瑕佹妸絀虹己鐨勯偅涓灞傚叏閮ㄤ粠瀹冪殑涓婁竴灞傛妸鐘舵佺戶鎵夸笅鏉ワ紝浠ヤ繚璇佸悗鏉ョ殑鐘舵佽漿縐葷殑姝g‘銆?/span>
鎬葷粨涓涓嬨?/font>
瀵逛簬涓閬撻鐩啓鍑虹姸鎬佽漿縐繪柟紼嬩箣鍚庯紝紼嬪簭鐨勫疄鐜版湁鏃跺欐槸鏄捐屾槗瑙佺殑錛屼絾鏈夋椂鍊欏嵈鍙堥渶瑕佹濊冧竴鐣傝繖鏃跺欒繕鏄渶瑕佺珛瓚充簬鐘舵佽漿縐繪柟紼嬶紝鍙﹀榪樿鑰冭檻鍒伴鐩腑鐨勪竴浜涢檺鍒舵潯浠訛紝璁捐鍚堥傜殑寰幆欏洪嗗簭鍜屽唴澶栧眰銆?/font>
//------------------------------------------------------------
鏈榪戜竴孌墊椂闂翠粩緇嗗湴瀛︿範浜嗘悳绱㈡柟闈㈢殑涔︾睄錛屽鎼滅儲鏈変簡涓浜涙柊鐨勪綋浼氥傛悳绱㈢殑綆楁硶鏈夊緢澶氾紝浠庢渶綆鍗曠殑DFS銆丅FS錛屽埌紼嶇◢鏈夌偣浼樺寲鐨勮凱浠e姞娣便佽凱浠e姞瀹斤紝鍐嶅埌A*銆両DA*……鎰熻瀵逛簬鎼滅儲鐨勫涔犲拰榪愮敤錛岀粷瀵逛笉鑳藉彧灞闄愪簬榪欎簺甯哥敤鐨勬柟娉曚腑錛岃屽簲璇ュ鍚勪釜鏂規硶鏈変竴涓暣浣撶殑鎶婃彙錛屽垎鏋愬悇縐嶆柟娉曠殑浼樼偣鍜岀己鐐癸紝瀛︿細姣旇緝鍚勭鏂規硶鐨勬椂絀烘ц兘錛岄拡瀵歸鐩殑鐗圭偣鍏ユ墜銆?/font>
DFS
鏈甯哥敤鐨勪竴縐嶆悳绱㈡柟娉曪紝鍑犱箮瀛﹁繃鎼滅儲鐨勯兘浼氥傞傜敤浜庢悳绱㈢殑娣卞害宸茬煡錛屾瘮杈冮傚悎鎼滅儲鍏ㄩ儴瑙c傚父鐢ㄧ殑浼樺寲鏂規硶鏄湪緇撶偣鎵╁睍鏃跺姞鍏ュ壀鏋濈瓥鐣ャ?/font>
BFS
鐩稿涓嶥FS鍙兘鐢ㄥ緱灝戜簡鐐癸紝浣嗕篃鏄繀浼氱殑鍩烘湰鏂規硶銆傚鏋滄悳绱㈢殑娣卞害涓嶇煡錛孌FS鍙兘闄峰叆姝誨驚鐜紝鍚屾椂錛屽鏋滅┖闂翠笂鍙互鎵垮彈錛岃繖鏃跺欏彲浠ヨ冭檻BFS銆備晶閲嶅姹傛渶浼樿В銆?/font>
鍙屽悜騫垮害浼樺厛鎼滅儲
閫傜敤浜庣煡閬撶洰鏍囩姸鎬侊紝姣忔鎵╁睍涓や釜緇撶偣錛屼絾涓嶄竴瀹氶潪瑕佹槸浜ゆ浛鎵╁睍錛屾墿灞曟柟寮忓緢澶氥傚鏋滅洰鏍囩姸鎬佸緇堜笉鍙橈紝鑰屾湁澶氫釜鍒濆鐘舵侊紝灝卞彲浠?#8220;鍛ㄧ晫鎼滅儲”銆傝娉ㄦ剰鐨勬槸錛屽浣曞垽鏂凡緇忔墿灞曠粨鐐規槸鍚﹀湪鍙︿竴绔殑鏂規硶錛屾槸闇瑕佽鐪熻冭檻錛岄夊彇鏈浼樺垽鏂柟娉曠殑銆?/font>
榪唬鍔犳繁鎼滅儲 ID
姣忔闄愬埗鎼滅儲鐨勬繁搴︼紝鎵懼埌瑙e氨鍋滄錛屽惁鍒欏姞澶ф繁搴﹀啀嬈℃悳绱€傜浉瀵逛簬DFS涓嶄細闄峰叆姝誨驚鐜紝鐩稿浜嶣FS涓嶄細鍦ㄧ┖闂翠笂鏈夊帇鍔涳紝涔熷彲浠ョ敤鏉ュ姹傛渶浼樿В錛屼笉榪囩己鐐規槸閲嶅鎼滅儲銆?/font>
榪唬鍔犲鎼滅儲 IB
娌℃湁澶鎺ヨЕ錛屾棤瑙?#8230;…
A*
鎸塮(s)鐨勫兼墿灞曠粨鐐癸紝鏄竴縐嶅惎鍙戝紡鎼滅儲銆傞渶瑕佷袱涓〃錛屾瘡嬈″垽鏂槸鍚﹀湪琛?涓佹槸鍚﹀湪琛ㄤ簩涓佸悓鏃跺湪琛ㄤ竴琛ㄤ簩涓紝鍒ゆ柇f(s)鍜宖(s')鐨勫ぇ灝忥紝閫夋嫨鏄惁鏇挎崲銆傚叾涓璮(s)=g(s)+h(s)錛宧(s)涓轟及浠峰嚱鏁般傝姹俬鍑芥暟鐩稿錛屽浜庤繖縐嶈娉曪紝鎴戣嚜宸辯殑鐞嗚В灝辨槸錛岀姸鎬佹瘡杞Щ涓嬈★紝h鍑忓皯閲忔渶澶氫負1銆侫*綆楁硶姹傚緱鐨勭涓涓В蹇呮槸鏈浼樿В銆傜己鐐逛緷鐒舵槸絀洪棿闇姹傚お澶с?/font>
IDA*
榪唬鍔犳繁鐨凙*銆傛瘡嬈℃悳绱㈠姞涓婁竴涓繁搴﹂檺鍒訛紝鎵╁睍鐨勬椂鍊欏垽鏂渶濂芥儏鍐墊槸鍚︿細瓚呰繃娣卞害錛屼篃綆楁槸涓縐嶆瀬绔硶鐨勫壀鏋濇濇兂銆傞傜敤涓庢繁搴︿笉瀹氾紝鏈浼樿В鐨勬繁搴﹀張涓嶄竴瀹氬緢娣憋紝鑰岀姸鎬佽漿縐葷殑鏂瑰紡鍙堟湁寰堝錛屼嬌寰楃姸鎬佺┖闂存棤娉曟壙鍙椼?/font>
鍏充簬鍓灊錛?銆佸彲琛屾у壀鏋?2銆佹渶浼樻у壀鏋?/font>
鍏蜂綋鎿嶄綔鏃訛細1銆佹瀬绔硶 2銆佹暟瀛︽柟娉?/font>
騫舵煡闆嗙殑涓や釜浼樺寲錛氬熀浜巖ank鐨勫惎鍙戝紡鍚堝茍錛涜礬寰勫帇緙┿?/font>
浠ヤ笅鏄垜鐨勪唬鐮?/font>: