标签:
Air Raid Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
Description
Input
Output
Sample Input
Sample Output
最小路径覆盖:在二分图中寻找一个尽量小的边集,使图中每一个点都是该边集中某条边的端点。
最小路径覆盖 == 顶点数 - 最大匹配。
证明:因为一条边最多可以包含两个顶点,所以我们选边的时候让这样的边尽量多,也就是说最大匹配的边集数目咯。剩下的点就只能一个边连上一个点到集合里啦。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 5 using namespace std; 6 7 #define N 1200 8 9 int n, m, vis[N], maps[N][N], used[N]; 10 11 int found(int u) 12 { 13 for(int i = 1; i <= n; i++) 14 { 15 if(maps[u][i] && !vis[i]) 16 { 17 vis[i] = 1; 18 if(!used[i] || found(used[i])) 19 { 20 used[i] = u; 21 return true; 22 } 23 } 24 } 25 return false; 26 } 27 28 int main() 29 { 30 int t, x, y; 31 32 scanf("%d", &t); 33 34 while(t--) 35 { 36 memset(maps, 0, sizeof(maps)); 37 memset(used, 0, sizeof(used)); 38 39 scanf("%d%d", &n, &m); 40 41 while(m--) 42 { 43 scanf("%d%d", &x, &y); 44 maps[x][y] = 1; 45 } 46 int num = 0; 47 for(int i = 1; i <= n; i++) 48 { 49 memset(vis, 0, sizeof(vis)); 50 if(found(i)) 51 num++; 52 } 53 printf("%d\n", n-num); 54 } 55 return 0; 56 }
标签:
原文地址:http://www.cnblogs.com/Tinamei/p/4720088.html