救命,一个小拓扑,40,wa#2#3#5
查看原帖
救命,一个小拓扑,40,wa#2#3#5
365532
Mr_ll楼主2022/5/25 20:19
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define ll long long
using namespace std;
const int N=110,M=54444;
queue<int> q;
int n,m,p,z[N];
int a,b,h[N],cnt,r[N],num;
ll s,c[N],u[N];
struct qwe{
	int to,net;
	ll dis;
}tr[M];
struct we{
	int id;
	ll k;
}l[N];
void add(int a,int b,ll s){
	tr[++cnt].to=b;
	tr[cnt].dis=s;
	tr[cnt].net=h[a];
	h[a]=cnt;
}
bool mm(we a,we b){
	return a.id<b.id;
}
int main(){
	scanf("%d%d",&n,&p);
	for(int i=1;i<=n;i++) scanf("%lld%lld",&c[i],&u[i]);
	for(int i=1;i<=p;i++){
		scanf("%d%d%lld",&a,&b,&s);
		add(a,b,s);r[b]++;
	}
	for(int i=1;i<=n;i++){
		if(!r[i]) q.push(i);
		else c[i]-=u[i];
	} 
	while(!q.empty()){
		int x=q.front();
		q.pop();
		for(int i=h[x];i;i=tr[i].net){
			int y=tr[i].to;
			ll zs=tr[i].dis;
			r[y]--;
			if(zs<0) continue;
			c[y]+=zs*c[x];
			if(!r[y]){
				q.push(y);
				if(!h[y]&&c[y]){
					l[++num].id=y;
					l[num].k=c[y];	
				}
			}
		}
	}
	sort(l+1,l+1+num,mm);
	if(!num) puts("NULL");
	else{
		for(int i=1;i<=num;i++) printf("%d %lld\n",l[i].id,l[i].k);
	}
	return 0;
}
2022/5/25 20:19
加载中...