pku 2594 大意是说给定一个有向无环图,用最少的路径去覆盖整个图,路径间允许顶点相交
这个题一看就觉得是最小路径覆盖,可是允许顶点相交想了一会儿。说白了就一句话
既然允许顶点相交,那就要把连通性也传递下去,这样就可以变换到标准的最小路径覆盖问题
贴个代码,只此一次 主要是我的代码很很很丑
Code
1 ///loves DL~~
2
3 #include <iostream>
4 #include <algorithm>
5
6 using namespace std;
7
8 const int MAXN=510;
9 bool gg[MAXN][MAXN];
10 int link[MAXN];
11 bool s[MAXN];
12 int m,n;
13
14 bool find(int x)
15 {
16 int i;
17 for(i=1;i<=n;i++){
18 if((!s[i])&&gg[x][i]){
19 s[i]=true;
20 if(link[i]==0||find(link[i])){
21 link[i]=x;
22 return true;
23 }
24 }
25 }
26 return false;
27 }
28
29 int main()
30 {
31 freopen("in.txt","r",stdin);
32 while(scanf("%d%d",&n,&m)!=EOF&&!(m==0&&n==0))
33 {
34 memset(gg,0,sizeof(gg));
35 memset(link,0,sizeof(link));
36 int i,j,k;
37 int st,e;
38 for(i=0;i<m;i++)
39 {
40 scanf("%d%d",&st,&e);
41 gg[st][e]=true;
42 }
43 ////Floyd 求传递闭包
44 for(k=1;k<=n;k++)
45 {
46 for(i=1;i<=n;i++)
47 {
48 for(j=1;j<=n;j++)
49 {
50 if(gg[i][k]&&gg[k][j]&&!gg[i][j])
51 gg[i][j]=true;
52 }
53 }
54 }
55 ////寻找最小路径覆盖
56 int ans=0;
57 for(i=1;i<=n;i++)
58 {
59 memset(s,false,sizeof(s));
60 if(find(i))
61 {
62 ans++;
63 }
64 }
65 printf("%d\n",n-ans);
66 }
67
68 return 0;
69