求助 0分
查看原帖
求助 0分
851870
zbk_ning楼主2023/12/15 22:55
#include<bits/stdc++.h>
using namespace std;



const int N = 400;
const int mod=80112002;
int e[N], ne[N];//邻接表存储图
int h[N],in[N],out[N],w[N];

int cnt[N];
int idx=0;
int n, m,ans;//保存图的点数和边数
queue<int> q; 
int t;
int a,b;

//floyd求一个点是否能到达一个点 
//用floyed求出每个点与其他点的关系,只要这个点和其他
//n-1个点的关系都确定了,就能确定他的排名。

void add(int a,int b,int c){
	e[idx]=b;
	w[idx]=c;
	ne[idx]=h[a];
	h[a]=idx++;
}

void topsort(){

	while(q.size()){
		int t=q.front();
		q.pop();
		
		if(cnt[t]<=0){
				for(int i=h[t];i!=-1;i=ne[i]){
				int j=e[i];
				in[j]--;
				if(in[j]==0) q.push(j);
			}
			continue;
		}
		else{
				for(int i=h[t];i!=-1;i=ne[i]){
				int j=e[i];
				cnt[j]+=cnt[t]*w[i];
				//topsort+dp
				in[j]--;
				if(in[j]==0) q.push(j);
			}
		}
		
		
	}
}


int main(){
	int u;
	memset(h,-1,sizeof h);
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		cin>>cnt[i]>>u;
		if(cnt[i]!=0) q.push(i);
		else cnt[i]-=u;
	}
	
	int a,b,c;
	for(int i=1;i<=m;i++){
		cin>>a>>b>>c;
		add(a,b,c);
		in[b]++;
		out[a]=1;
	}
	
	topsort();
	
	int flag=0;
	
	for(int i=1;i<=n;i++){
		if(out[i]==0&&cnt[i]>0){
			cout<<i<<" "<<cnt[i]<<endl;
			flag=1;
		}
	}
	if(flag==0) cout<<"NULL"<<endl;
}











2023/12/15 22:55
加载中...