题解

1 条题解

  • 0
    @ 2017-07-04 16:59:29

    简单查分约束

    /*
    作者:Devil_Gary
    题目:p2404 糖果
    */
    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    const ll maxn=100010;
    ll n,tot=1,k,flag,head[maxn],vis[maxn],dis[maxn];
    queue<int>s;
    struct Edge
    {
        ll v,w,nxt;
    }e[maxn*2];
    void bug()
    {
        cout<<"fk!!!"<<endl;
    }
    inline ll read()
    {
        ll f=1,x=0;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    void add(ll u,ll v,ll w)
    {
        e[++tot].v=v;
        e[tot].w=w;
        e[tot].nxt=head[u];
        head[u]=tot;
    }
    void init()
    {
        n=read();k=read();
        ll x,a,b;
        while(k--)
        {
            x=read();a=read();b=read();
            switch(x)
            {
                case 1:
                    add(a,b,0),add(b,a,0);break;
                case 2:
                    add(a,b,1);if(a==b) flag=true;break;
                case 3: 
                    add(b,a,0);break;
                case 4:
                    add(b,a,1);if(a==b) flag=true;break;
                case 5: 
                    add(a,b,0);break;
            }
        }
    }
    bool spfa()
    {
        for(ll i=1;i<=n;i++)
        s.push(i),vis[i]=dis[i]=1;
        while(!s.empty())
        {
            ll u=s.front();s.pop();
            if(dis[u]>n) 
            {
                return 1;   
            }
            for(ll i=head[u];i;i=e[i].nxt)
            {
                ll j=e[i].v;
                if(dis[u]+e[i].w>dis[j])
                {
                    dis[j]=dis[u]+e[i].w;
                    if(!vis[j]) s.push(j),vis[j]=true;
                }
            }
            vis[u]=false;
        }
        return 0;
    }
    ll getsum()
    {
        ll x=0;
        for(ll i=1;i<=n;i++)
        x+=dis[i];
        return x;
    }
    void work()
    {
        if(flag||spfa())cout<<-1<<endl;
        else cout<<getsum()<<endl;
    }
    int main()
    {
        init();
        work();
    }
    
  • 1

信息

难度
7
分类
(无)
标签
递交数
66
已通过
11
通过率
17%
被复制
1
上传者