POJ 2594

一个星球上有很多点,点与点之间有很多单向路

问可重点的最小路径覆盖

利用floyd缩点后求二分图最大匹配

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 const int maxn=505;
 6 int m,n;
 7 int map[maxn][maxn];
 8 int link[maxn],vis[maxn];
 9 void floyd()
10 {
11     int i,j,k;
12     for(k=1;k<=n;k++)
13         for(i=1;i<=n;i++)
14             for(j=1;j<=n;j++)
15             {
16                 if(map[i][k]&&map[k][j])
17                     map[i][j]=1;
18             }
19 }
20 bool dfs(int t)
21 {
22     int i;
23     for(i=1;i<=n;++i)
24     {
25         if(!vis[i]&&map[t][i])
26         {
27             vis[i]=1;
28             if(link[i]==-1||dfs(link[i]))
29             {
30                 link[i]=t;
31                 return 1;
32             }
33         }
34     }
35     return 0;
36 }
37 int main()
38 {
39     int ans,i,b,a;
40     while(~scanf("%d%d",&n,&m)&&(n+m))
41     {
42         memset(map,0,sizeof(map));
43         for(i=1;i<=m;i++) 
44         {
45             scanf("%d%d",&a,&b);
46             map[a][b]=1;
47         }
48         floyd();
49         memset(link,-1,sizeof(link));
50         ans=0;
51         for(i=1;i<=n;i++)
52         {
53             memset(vis,0,sizeof(vis));
54             if(dfs(i)) ans++;
55         }
56         printf("%d
",n-ans);
57     }
58 }
59  
我自倾杯,君且随意
原文地址:https://www.cnblogs.com/nicetomeetu/p/5512287.html