[NOIP2003提高组]神经网络

题目:洛谷P1038、Vijos P1105、codevs1088。

题目大意:给你一个有向图,每个非源点i的值的计算方式为$C_i=\sum\limits_{(j,i)\in E}W_{ji}C_j-U_i$,求每个汇点(没有出边的点)的值C。

解题思路:首先一遍DFS找出所有汇点,然后BFS计算即可。注意源点不需要减去U。

C++ Code:

#include
#include
#include
#include
#include
using namespace std;
int n,w[222][222],p;
struct sj{
    int c,u;
}a[222];
vectorIn,Out;
bool vis[222];
queueq;
void dfs(int t){
    vis[t]=true;
    bool hasnxt=false;
    for(int i=1;i<=n;++i)
    if(w[t][i]){
        hasnxt=true;
        if(!vis[i])dfs(i);
    }
    if(!hasnxt)Out.push_back(t);
}
void bfs(){
    memset(vis,0,sizeof(vis));
    for(int i=0;i0)
        for(int v=1;v<=n;++v)
        if(w[u][v]){
            a[v].c+=w[u][v]*a[u].c;
            if(!vis[v]){
                vis[v]=true;
                q.push(v);
            }
        }
    }
}
int main(){
    scanf("%d%d",&n,&p);
    for(int i=1;i<=n;++i){
        scanf("%d%d",&a[i].c,&a[i].u);
        if(a[i].c)In.push_back(i);
    }
    memset(w,0,sizeof w);
    while(p--){
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        w[x][y]=z;
    }
    memset(vis,0,sizeof vis);
    for(int i=0;i0){
        hasans=true;
        printf("%d %d\n",Out[i],a[Out[i]].c);
    }
    if(!hasans)puts("NULL");
    return 0;
}

 

转载于:https://www.cnblogs.com/Mrsrz/p/7405693.html

你可能感兴趣的:(人工智能,c/c++)