hdu 1317 XYZZY

这道题错了好几次。。
首先,判断联通时我用了并查集,次序完全乱掉了,当成了无向图在做orz。。。
看了题解恍然大悟。。 太愚蠢了我。。
然后发现floyd来判断联通,太机智了,膜拜,长知识了。。恩,活学活用,看来floyd的原理还要回顾一下。。
然后 开始做了, 卡在了数组大小上orz。。 又看题解,他们用的是vector。。。 恩,, 然后水水的过了。。
题目就是问你能不能活着到终点。 首先要保证我有路能到,其次,我的路要可走(为正),或者说路上有正环(我可以走到正环,而且可以走到终点)

代码

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
#define maxn 10005
int cnt;
int n;
struct sb
{
    int a;
    int b;
    int v;
}ways[10005];
int node[110];
int way[110][110];
bool boom()
{
    for(int i=1;i<=n;i++)
    {
        node[i]=-0x3f3f3f3f;
    }
    node[1]=100;
    for(int i=1;i<n;i++)
    {
        bool flag=true;
        for(int j=1;j<=cnt;j++)
        {
            if(node[ways[j].b]<node[ways[j].a]+ways[j].v&&node[ways[j].a]>0&&node[ways[j].a]+ways[j].v>0)
            {
                node[ways[j].b]=node[ways[j].a]+ways[j].v;
                flag=false;
            }
        }
        if(flag)
            break;
    }
    if(node[n]>0)
        return true;
    for(int j=1;j<=cnt;j++)
    {
        if(node[ways[j].b]<node[ways[j].a]+ways[j].v&&node[ways[j].a]>0&&node[ways[j].a]+ways[j].v>0)
        {
            if(way[ways[j].b][n])
            {
                return true;
            }
        }
    }
    return false;
}
int main()
{
    while(cin>>n)
    {
        cnt=0;
        if(n==-1)
            break;
        memset(way,0,sizeof(way));
        for(int i=1;i<=n;i++)
        {
            int v,m,who;
            cin>>v>>m;
            for(int j=1;j<=m;j++)
            {
                cin>>who;
                cnt++;
                ways[cnt].a=i;
                ways[cnt].b=who;
                ways[cnt].v=v;
                way[i][who]=1;
            }
        }
        for(int k=1;k<=n;k++)
        {
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=n;j++)
                {
                    if(way[i][j]==0&&way[i][k]==1&&way[k][j]==1)
                    {
                        way[i][j]=1;
                    }
                }
            }
        }
        if(way[1][n]==0)
        {
            cout<<"hopeless"<<endl;
        }
        else
        {
            if(boom())
            {
                cout<<"winnable"<<endl;
            }
            else
            {
                cout<<"hopeless"<<endl;
            }
        }

    }
    return 0;
}

你可能感兴趣的:(HDU,floyd,bford)