使用了书上讲的迭代加深搜索,假设删除一个点,两个点,三个点。。。每次都先找最短路径再枚举最短路径上的点删除,dfs实现,A的很顺利,呵呵。。
1 #include<stdio.h>
2 #include<string.h>
3 int n,m,k;
4 int tot;
5 bool goal;
6 int fa[60];
7 bool flag[60];
8 int d[50][100];
9 int head[60];
10 int Q[10000];
11 struct node
12 {
13 int t,next;
14 }edge[10005];
15 int sum;
16 void add(int s,int t)
17 {
18 edge[sum].t=t;
19 edge[sum].next=head[s];
20 head[s]=sum++;
21 }
22 void bfs()
23 {
24 memset(fa,-1,sizeof(fa));
25 int he=0,tail=1;
26 Q[he]=1;fa[1]=0;
27 while(he<tail)
28 {
29 int s=Q[he++];
30 for(int i=head[s];i!=-1;i=edge[i].next)
31 {//puts("bug");
32 int t=edge[i].t;
33 if(!flag[t]&&fa[t]==-1)
34 {
35 Q[tail++]=t;
36 fa[t]=s;
37 if(t==n) return ;
38 }
39 }
40 }
41 }
42 void dfs(int dep)
43 {
44 int i,j;
45 if(goal) return ;
46 bfs();
47 if(fa[n]==-1) {goal=true; return ; }
48 int num=0;
49 for(i=n;i>1;i=fa[i]){ num++; d[dep][num]=i;}
50 if(num>k) {goal=true;return ;}
51 if(dep>tot) return;
52 for(i=2;i<=num;i++)
53 {
54 flag[d[dep][i]]=true;
55 dfs(dep+1);
56 flag[d[dep][i]]=false;
57 }
58 }
59 int solve()
60 {
61 int i,j;goal=false;
62 for(i=0;i<=n;i++)
63 {
64 tot=i;
65 memset(flag,false,sizeof(flag));
66 dfs(1);
67 if(goal) return i;
68 }
69 return n;
70 }
71 int main()
72 {
73 int i,j,s,f;
74 while(scanf("%d%d%d",&n,&m,&k),(n+m+k))
75 {
76 sum=0;memset(head,-1,sizeof(head));
77 for(i=0;i<m;i++)
78 {
79 scanf("%d%d",&s,&f);
80 add(s,f);
81 }
82 printf("%d\n",solve());
83 }
84 return 0;
85 }
stl写的简洁一点。
1 #include<stdio.h>
2 #include<string.h>
3 #include<vector>
4 #include<queue>
5 using namespace std;
6 int n,m,k;
7 int tot;
8 bool goal;
9 int fa[60];
10 bool flag[60];
11 int d[50][100];
12 queue<int> Q;
13 vector<int> edge[60];
14 void bfs(){
15 memset(fa,-1,sizeof(fa));
16 while(!Q.empty()) Q.pop();
17 Q.push(1);fa[1]=0;
18 while(!Q.empty()){
19 int s=Q.front();Q.pop();
20 for(int i=0;i<edge[s].size();i++){
21 int t=edge[s][i];
22 if(!flag[t]&&fa[t]==-1){
23 Q.push(t);
24 fa[t]=s;
25 if(t==n) return ;
26 }
27 }
28 }
29 }
30 void dfs(int dep){
31 int i;
32 if(goal) return ;
33 bfs();
34 if(fa[n]==-1) {goal=true; return ; }
35 int num=0;
36 for(i=n;i>1;i=fa[i]){ num++; d[dep][num]=i;}
37 if(num>k) {goal=true;return ;}
38 if(dep>tot) return;
39 for(i=2;i<=num;i++) {
40 flag[d[dep][i]]=true;
41 dfs(dep+1);
42 flag[d[dep][i]]=false;
43 }
44 }
45 int solve()
46 {
47 int i;goal=false;
48 for(i=0;i<=n;i++){
49 tot=i;
50 memset(flag,false,sizeof(flag));
51 dfs(1);
52 if(goal) return i;
53 }
54 return n;
55 }
56 int main()
57 {
58 int i,s,f;
59 while(scanf("%d%d%d",&n,&m,&k),(n+m+k)){
60 for(i=0;i<=n;i++) edge[i].clear();
61 for(i=0;i<m;i++){
62 scanf("%d%d",&s,&f);
63 edge[s].push_back(f);
64 }
65 printf("%d\n",solve());
66 }
67 return 0;
68 }
69 //The 4th Baidu Cup final
网络流的做法好像真的有错,就不贴了