1、用IDDFS优化~用邻接矩阵保存边~复习了一下bfs~
#include<cstdio>
#include<cstring>
using namespace std;
const int maxm=4005;
const int maxn=55;
struct aaa{
int s,f,next;
};
aaa c[maxm];
int sta[maxn],fa[maxn],zh[maxn];
int d[maxn][maxn];
bool b[maxn];
int n,m,now,tot;
bool goal;
void ins(int s,int f){
now++;
c[now].s=s;
c[now].f=f;
c[now].next=sta[s];
sta[s]=now;
}
void bfs(){
int cl,op,k,t;
cl=0;op=1;
for(int i=1;i<=n;i++) fa[i]=0;
zh[1]=1;
fa[1]=-1;
while(cl<op){
cl++;k=zh[cl];
for(t=sta[k];t;t=c[t].next)
if(b[c[t].f]&&fa[c[t].f]==0){
op++;zh[op]=c[t].f;fa[c[t].f]=c[t].s;
if(c[t].f==n) break;
}
if(fa[n]) break;
}
}
void dfs(int deep){
int cl,op,l;
if(goal) return;
bfs();
if(fa[n]==0){
goal=true;
return;
}
l=0;
for(int k=n;k>1;k=fa[k]){
l++;d[deep][l]=k;
}
if(l>m){
goal=true;
return;
}
if(deep>tot) return;
for(int i=2;i<=l;i++){
b[d[deep][i]]=false;
dfs(deep+1);
b[d[deep][i]]=true;
}
}
int make(){
int i,j;
goal=false;
for(i=0;i<=n;i++){
tot=i;
for(j=1;j<=n;j++) b[j]=true;
dfs(1);
if(goal) return i;
}
return n;
}
int main()
{
int i,s,f,g;
while(true){
scanf("%d%d%d",&n,&g,&m);
if(n==0) break;
memset(sta,0,sizeof(sta));
now=0;
for(i=1;i<=g;i++){
scanf("%d%d",&s,&f);
ins(s,f);
}
g=make();
printf("%d\n",g);
}
return 0;
}