poj 2594 Treasure Exploration

最小路径覆盖

 

和1422的区别在于,这题的节点可以属于多条路,看了discuss后才明白 = = 真是不好好看题啊我。。

 

因为每个点可以属于多条路,如果只属于其中一条路的话,匹配后,另外连接这点的路可能就断了

 

所以用FLOYD讲图都连通,然后求最小覆盖即可。

 

#include <queue> #include <stack> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <iostream> #include <limits.h> #include <string.h> #include <algorithm> #define MAX 550 using namespace std; bool map[MAX][MAX],used[MAX]; int mat[MAX]; bool Augment(int x,int n) { int i; for(i=1; i<=n; i++) if( !used[i] && map[x][i] ) { used[i] = true; if( !mat[i] || Augment(mat[i],n) ) { mat[i] = x; return true; } } return false; } int Hungary(int n,int m) { int i,sum = 0; memset(mat,0,sizeof(mat)); for(i=1; i<=n; i++) { memset(used,false,sizeof(used)); if( Augment(i,m) ) sum++; } return sum; } int main() { int n,m,from,to,i,j,k; while( ~scanf("%d%d",&n,&m) ) { if( n == m && n == 0 ) break; memset(map,false,sizeof(map)); while( m-- ) { scanf("%d%d",&from,&to); map[from][to] = true; } for(i=1; i<=n; i++) for(k=1; k<=n; k++) for(j=1; j<=n; j++) if( map[k][i] && map[i][j] ) map[k][j] = true; int ans = Hungary(n,n); printf("%d/n",n-ans); } return 0; }  

你可能感兴趣的:(poj 2594 Treasure Exploration)