标签:poj
http://poj.org/problem?id=1463
Time Limit: 2000MS | Memory Limit: 10000K | |
Total Submissions: 6413 | Accepted: 2973 |
Description
Input
Output
Sample Input
4 0:(1) 1 1:(2) 2 3 2:(0) 3:(0) 5 3:(3) 1 4 2 1:(1) 0 2:(0) 0:(0) 4:(0)
Sample Output
1 2
Source
/** * @author neko01 */ //#pragma comment(linker, "/STACK:102400000,102400000") #include <cstdio> #include <cstring> #include <string.h> #include <iostream> #include <algorithm> #include <queue> #include <vector> #include <cmath> #include <set> #include <map> using namespace std; typedef long long LL; #define min3(a,b,c) min(a,min(b,c)) #define max3(a,b,c) max(a,max(b,c)) #define pb push_back #define mp(a,b) make_pair(a,b) #define clr(a) memset(a,0,sizeof a) #define clr1(a) memset(a,-1,sizeof a) #define dbg(a) printf("%d\n",a) typedef pair<int,int> pp; const double eps=1e-9; const double pi=acos(-1.0); const int INF=0x3f3f3f3f; const LL inf=(((LL)1)<<61)+5; const int N=1505; vector<int>g[N]; int dp[N][2]; void dfs(int u,int fa) { dp[u][1]=1; dp[u][0]=0; for(int i=0;i<g[u].size();i++) { int v=g[u][i]; if(v!=fa) { dfs(v,u); dp[u][1]+=min(dp[v][1],dp[v][0]); dp[u][0]+=dp[v][1]; } } } int main() { int n; while(~scanf("%d",&n)) { for(int i=0;i<=n;i++) g[i].clear(); for(int i=0;i<n;i++) { int u,v,x; scanf("%d:(%d)",&u,&x); while(x--) { scanf("%d",&v); g[u].pb(v); g[v].pb(u); } } dfs(0,-1); printf("%d\n",min(dp[0][0],dp[0][1])); } return 0; }
/** * @author neko01 */ //#pragma comment(linker, "/STACK:102400000,102400000") #include <cstdio> #include <cstring> #include <string.h> #include <iostream> #include <algorithm> #include <queue> #include <vector> #include <cmath> #include <set> #include <map> using namespace std; typedef long long LL; #define min3(a,b,c) min(a,min(b,c)) #define max3(a,b,c) max(a,max(b,c)) #define pb push_back #define mp(a,b) make_pair(a,b) #define clr(a) memset(a,0,sizeof a) #define clr1(a) memset(a,-1,sizeof a) #define dbg(a) printf("%d\n",a) typedef pair<int,int> pp; const double eps=1e-9; const double pi=acos(-1.0); const int INF=0x3f3f3f3f; const LL inf=(((LL)1)<<61)+5; const int N=1505; vector<int>g[N]; int cx[N]; int cy[N]; bool vis[N]; int n1,n2; bool dfs(int u) { for(int i=0;i<g[u].size();i++) { int v=g[u][i]; if(!vis[v]) { vis[v]=true; if(cy[v]==-1||dfs(cy[v])) { cy[v]=u; cx[u]=v; return true; } } } return false; } int hungary() { clr1(cx); clr1(cy); int ans=0; for(int i=0;i<n1;i++) { if(cx[i]==-1) { clr(vis); if(dfs(i)) ans++; } } return ans; } int main() { int n; while(~scanf("%d",&n)) { for(int i=0;i<=n;i++) g[i].clear(); for(int i=0;i<n;i++) { int u,v,x; scanf("%d:(%d)",&u,&x); while(x--) { scanf("%d",&v); g[u].pb(v); g[v].pb(u); } } n1=n2=n; printf("%d\n",hungary()/2); } return 0; }
poj1463 Strategic game 树的最小点覆盖
标签:poj
原文地址:http://blog.csdn.net/neko01/article/details/39960369