刷题记录:牛客NC16679神经网络

传送门:牛客

题目描述:

题目较长,此处暂略
输入:
5 6
1 0
1 0
0 1
0 1
0 1
1 3 1
1 4 1
1 5 1
2 3 1
2 4 1
2 5 1
输出:
3 1
4 1
5 1

首先,这是一道拓扑的好题,但是这道题的描述很烂,要是不是为了题解目录的完整性,我甚至可能不会做这道题

首先这道题的题面中并没有说中间层是一层一层的,但是实际上就是一层一层的,这说明了什么呢,当你在BFS的时候只要入队一次等到下一次到队列中的这个点时,这一点就是已经被更新完的.其次这道题没有明确说明输入输出的边是单向的,只是隐晦的带了几笔,很容易搞出歧义.假设是双向边的话,我们就需要多进行一步BFS来统计每个点的输入情况了.

排除上述的问题,我们再来解决这道题

主要思路:

  1. 首先对于这道题我们先记录一下每一个点的出度情况,因为是单向边,所以这个很好统计.最后没有出度的肯定就是我们的输出端
  2. 然后对于我们的每一个点,我们用BFS来进行遍历.当我们遍历到邻接点的时候,更新一下邻接点的值,直接加入队列里面即可.因为我们的点是一层一层的,这就保证了后面以及同层的点是不会联通的,所以当我们前面的点遍历完之后我下一层的点就是已经被更新完的.所以正确性得到保证
  3. 对于最终答案,我们只要记录状态大于0且出度为0的点即可

注意状态一定要大于0,因为状态可能是负的,但是非0都是真!!!

下面是具体的代码部分:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <string.h>
#include <stack>
#include <deque>
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
#define root 1,n,1
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
inline ll read() {
	ll x=0,w=1;char ch=getchar();
	for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;
	for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
	return x*w;
}
#define maxn 1000000
#define ll_maxn 0x3f3f3f3f3f3f3f3f
const double eps=1e-8;
vector<int>edge[maxn];
int n,p;int state[200],U[200];int out[200];int w[200][200];int vis[200];
int main() {
	queue<int>q;
	n=read();p=read();
	for(int i=1;i<=n;i++) {
		state[i]=read();U[i]=read();
		if(state[i]>0) q.push(i),vis[i]=1;
		else state[i]-=U[i];
	}
	int u,v;
	for(int i=1;i<=p;i++) {
		u=read();v=read();w[u][v]=read();
		out[u]++;
		edge[u].push_back(v);
	}
	while(!q.empty()) {
		int u=q.front();q.pop();
		if(state[u]<=0) continue; 
		for(int i=0;i<edge[u].size();i++) {
			int v=edge[u][i];
			state[v]+=w[u][v]*state[u];
			if(vis[v]) continue;
			q.push(v);vis[v]=1;
		}
	}
	int flag=0;
	for(int i=1;i<=n;i++) {
		if(out[i]==0&&state[i]>0) {
			printf("%d %dn",i,state[i]);
			flag=1;
		} 
	}
	if(flag==0) cout<<"NULL"<<endl;
	return 0;
}

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>