P1226神经网络

  提交了7次,看了无数题解,要死啊~~~。(无限吐槽这道题。。。

  据说是Toposort,我其实也不是很清楚,反正BFS就可以过;写题之前先把题看懂;

  根据公式,因为入度为零的点不会被传递,所以阈值是无用的,所以那个阈值除入度为零的点以外可以直接减去(读题最重要!!!),而搜索就是从入度为零(即没有边指向的这个点)开始的,所以输入时就记录一下入读和出度;传递就规规矩矩的模拟就行了,细节很多,多加注意,切切切...

  

#include <bits/stdc++.h>

using namespace std;

#define INF 0x3f3f3f3f
#define MAXN 1000000
#define MAXM 5000
#define D 10

inline int read()
{
    int x = 0,ff = 1;char ch = getchar();
    while(!isdigit(ch))
    {
        if(ch == '-') ff = -1;
        ch = getchar();
    }
    while(isdigit(ch))
    {
        x = (x<<1) + (x<<3) + (ch ^ 48);
        ch = getchar();
    }
    return x * ff;
}

inline void write(int x)
{
    if(x < 0) putchar('-'),x = -x;
    if(x > 9) write(x / 10);
    putchar(x % 10 + '0');
}

int n,b,x,y,v,tot = 0,head = 1,tail = 0,ans = 0;
int flag[MAXN + D],value[MAXN + D],q[MAXN + D];
int r[MAXN + D],c[MAXN + D];
int a[MAXM + D][MAXM + D],vis[MAXN + D];

void BFS()
{
    for(head = 1;head <= tail;++head)
    {
        int m = q[head]; vis[m] = false;
        if(flag[m] <= 0) continue;
        for(int i = 1;i <= n;++i)
        {
            if(a[m][i])
            {
                flag[i] += a[m][i] * flag[m] ;
                if(!vis[i])
                {
                    q[++tail] = i;
                    vis[i] = true;
                }
            }
        }
    }
}

int main()
{
    memset(a,0,sizeof(a));
    n = read(); b = read();
    for(int i = 1;i <= n;++i)
    {
        flag[i] = read();
        value[i] = read();
        if(!flag[i]) flag[i] -= value[i];
        else 
        {
            q[++tail] = i;
            vis[i] = true;
        }
    }
    for(int i = 1;i <= b;++i)
    {
        x = read(); y = read(); v = read();
        a[x][y] = v;
        r[y]++; c[x]++;
    }
    BFS();
    for(int i = 1;i <= n;++i)
    if(flag[i] > 0&&!c[i])
    {
        ans = 1;
        write(i); putchar(' '); write(flag[i]);
        putchar('\n');
    }
    if(!ans) printf("NULL");
    return 0;
}

 

posted @ 2019-01-07 13:50  海边微风起  阅读(203)  评论(0编辑  收藏  举报