Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

原来是覆盖边,我写了个覆盖点的。。。

Posted by proverbs at 2012-07-15 20:27:19 on Problem 1463 and last updated at 2012-07-15 20:30:26
#include <iostream>
#include <cstdio>
#include <cstdlib>
#define N 15100
#define M 151000
using namespace std;
int n,son[M],next[M],fa[N],in[N],dp[M][4],root;
void add(int u,int v)
{
	next[v]=son[u]; son[u]=v; fa[v]=u;
}
void read()
{
	memset(son,-1,sizeof son);
	memset(next,-1,sizeof next);
	memset(in,0,sizeof in);
	int a,b,c;
	for(int i=1;i<=n;i++)
	{
		scanf("%d:(%d)",&a,&b);
		for(int j=1;j<=b;j++)
		{
			scanf("%d",&c);
			add(a+1,c+1);
			in[c+1]++;
		}
	}
}
void getroot()
{
	for(int i=1;i<=n;i++)
	   if(in[i]==0) {root=i;break;}
}
int search(int x,int pd)//覆盖边!! 
{
    if(dp[x][pd]<=9999999) return dp[x][pd];
    if(pd==0)//x父节点没有人看 
    {
        if(next[x]==-1&&son[x]==-1) return dp[x][pd]=1;
        else if(next[x]==-1&&son[x]!=-1)
        {
            dp[x][pd]=min(dp[x][pd],1+search(son[x],1));
        } 
        else if(son[x]==-1&&next[x]!=-1)
        {
            dp[x][pd]=min(dp[x][pd],search(next[x],0)+1);
        } 
        else 
        { 
            dp[x][pd]=min(dp[x][pd],1+search(son[x],1)+search(next[x],0));
        } 
        return dp[x][pd]; 
    } 
    else//x的父亲结点有人看 
    {
        if(next[x]==-1&&son[x]==-1) return dp[x][pd]=0;
        else if(next[x]==-1&&son[x]!=-1)
        {
            dp[x][pd]=min(dp[x][pd],1+search(son[x],1));
            dp[x][pd]=min(dp[x][pd],search(son[x],0));
        } 
        else if(son[x]==-1&&next[x]!=-1)
        {
            dp[x][pd]=min(dp[x][pd],search(next[x],1));
        } 
        else 
        { 
            dp[x][pd]=min(dp[x][pd],search(son[x],0)+search(next[x],1));
            dp[x][pd]=min(dp[x][pd],search(son[x],1)+1+search(next[x],1));
        }
        return dp[x][pd]; 
    } 
    
    /*覆盖点版!! 
    if(dp[x][pd]<=9999999) return dp[x][pd]; 
	if(pd==0)//父节点已经覆盖 
	{
        if(next[x]==-1&&son[x]==-1) return dp[x][pd]=0; 
        else if(next[x]==-1&&son[x]!=-1)
        {
            dp[x][pd]=min(dp[x][pd],search(son[x],2));
		    dp[x][pd]=min(dp[x][pd],search(son[x],0)+1);
        } 
        else if(son[x]==-1&&next[x]!=-1)
        {
            dp[x][pd]=min(dp[x][pd],search(next[x],0));
        } 
        else
        { 
            dp[x][pd]=min(dp[x][pd],search(son[x],2)+search(next[x],0));
    		dp[x][pd]=min(dp[x][pd],search(son[x],0)+1+search(next[x],0));
    	} 
		return dp[x][pd];
	}
	else if(pd==2)//本节点和其子节点之一必须要放置一个 
	{
        if(next[x]==-1&&son[x]==-1) return dp[x][pd]=1; 
        else if(next[x]==-1&&son[x]!=-1)
        {
            dp[x][pd]=min(dp[x][pd],search(son[x],0)+1);
            dp[x][pd]=min(dp[x][pd],search(son[x],1));
        } 
        else if(son[x]==-1&&next[x]!=-1)
        {
            dp[x][pd]=min(dp[x][pd],search(next[x],2)+1);
        } 
        else
        {
            dp[x][pd]=min(dp[x][pd],search(son[x],0)+1+search(next[x],0));
            dp[x][pd]=min(dp[x][pd],search(son[x],1)+search(next[x],0));
        } 
        return dp[x][pd];
    }
    else//本节点(或兄弟节点)必须放置 (其父节点必由父节点的子节点覆盖) 
    {
        if(son[x]==-1&&next[x]==-1) return dp[x][pd]=1;
        else if(son[x]==-1&&next[x]!=-1)
        {
            dp[x][pd]=min(dp[x][pd],search(next[x],2)+1);
        }
        else if(son[x]!=-1&&next[x]==-1)
        {
            dp[x][pd]=min(dp[x][pd],search(son[x],0)+1);
        } 
        else
        { 
            dp[x][pd]=min(dp[x][pd],search(son[x],0)+1+search(next[x],2));
            dp[x][pd]=min(dp[x][pd],search(son[x],1)+search(next[x],1));
             
        } 
        return dp[x][pd];
    }*/ 
}
void go()
{
	memset(dp,0x7f,sizeof dp);
	dp[root][0]=search(root,0);
	printf("%d\n",dp[root][0]);
}
int main()
{
	while(scanf("%d",&n)!=EOF)
	{
		read();
		getroot();
		go();
	}
	system("pause"); 
	return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator