1. 程式人生 > 其它 >演算法整理 & 複習:拓撲排序

演算法整理 & 複習:拓撲排序

技術標籤:資料結構與演算法演算法c++

拓撲排序


int in[MAXN];

void topsort(){
	queue <int>que;
	for(int i=1;i<=n;i++){
		if(!in[i]) que.push(i);
	}
	while(!que.empty()){
		int u = que.front();
		que.pop();
		for(int k=head[u];k;k=map[k].next){
			int v = map[k].to;
			in[v]--;
			if(!in[v]){
				que.push(v)
; } } } }

P1038 神經網路

#include <stdio.h>
#include <queue>
#include <iostream>
using namespace std;
#define MAXN 100005

int n,m,ct;
int c[MAXN],U[MAXN];

int cnt;
int head[MAXN];

struct node{
	int from,to,next,w;
}map[MAXN];

void add(int u,int v,int w){
	map[++cnt] = (node){u,v,
head[u],w}; head[u] = cnt; } int in[MAXN],out[MAXN]; void topsort(){ queue <int>que; for(int i=1;i<=n;i++){ if(!in[i]) que.push(i); } while(!que.empty()){ int u = que.front(); que.pop(); for(int k=head[u];k;k=map[k].next){ int v = map[k].to; int w = map[k].w; c[v] +=
w*c[u]; in[v]--; if(!in[v]){ que.push(v); c[v] -= U[v]; if(c[v] <= 0) c[v] = 0; } } } } int main(void) { cin >> n >> m; for (int i=1;i<=n;i++){ int x,y; cin >> x >> y; c[i] = x; U[i] = y; } for (int i=1;i<=m;i++){ int u,v,w; cin >> u >> v >> w; add(u,v,w); in[v]++; out[u]++; } topsort(); for(int i=1;i<=n;i++){ if(!out[i] && c[i]>0){ cout << i << " " << c[i] << endl; ct = 1; } } if(!ct) cout << "NULL"; return 0; }





返回