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

用搜索,16MS

Posted by husanfeng at 2012-11-07 21:54:24 on Problem 1932
#include <cstdlib>
#include <iostream>

using namespace std;

const int maxn=102;

struct node
{
    int to;
    int next;
};

node edge[maxn*maxn];
node edge1[maxn*maxn];
int head[maxn];
int head1[maxn];
bool ac[maxn];
int isin[maxn];
int point[maxn];
int total[maxn];
int stack[maxn+10];

void dfs(int x)
{
    isin[x]=1;
    ac[x]=true;
    for(int k=head1[x];k!=-1;k=edge1[k].next)
    {
        if(!isin[edge1[k].to])
            dfs(edge1[k].to);
    }
}
                
int main()
{
    int n,i,j,k,t,x,c,ptr,top;
    while(scanf("%d",&n)==1)
    {
        if(n==-1) break;
        if(n==1)
        {
            printf("winnable\n");
            continue;
        }
        for(i=1;i<=n;i++)
        {
            head[i]=-1;
            head1[i]=-1;
            total[i]=-1;
            isin[i]=0;
            ac[i]=false;
        }          
        c=0;   
        for(i=1;i<=n;i++)
        {
            scanf("%d%d",&point[i],&t);
            for(j=1;j<=t;j++)
            {
                scanf("%d",&x);
                edge[c].to=x;
                edge[c].next=head[i];
                head[i]=c;
                edge1[c].to=i;
                edge1[c].next=head1[x];
                head1[x]=c++;
            }
        }
        dfs(n);
        if(!ac[1]) printf("hopeless\n");
        else 
        {
            for(i=1;i<=n;i++) isin[i]=0;
            bool ju=false;
            total[1]=100;
            ptr=0;
            stack[++ptr]=1;
            while(ptr&&!ju)
            {
                top=stack[ptr--];
                isin[top]=2;
                for(k=head[top];k!=-1&&!ju;k=edge[k].next)
                {
                    if(ac[edge[k].to])
                    {
                        int temp=total[top]+point[edge[k].to];
                        if(temp>0&&temp>total[edge[k].to])
                        {
                            total[edge[k].to]=temp;                              
                            if(edge[k].to==n||isin[edge[k].to]==2) ju=true;
                            else if(!isin[edge[k].to])
                            {
                                stack[++ptr]=edge[k].to;
                                isin[edge[k].to]=1;
                            }
                        }
                    }
                }
            }
            if(ju) printf("winnable\n");
            else printf("hopeless\n");
        }
    }                                                                                                                                                                                                                                                                                      
    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