标签: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