主要就是一个拓扑排序,每次找到一个入度为零的点,然后更新别的点的C值。
#include<cstdio> #include<cctype> #include<vector> using namespace std; inline int read(){ char c; while(c=getchar(),!isdigit(c) && c!=‘-‘); int x=0,y=1; if(c==‘-‘) y=-1; else x=c-‘0‘; while(c=getchar(),isdigit(c)) x=x*10+c-‘0‘; return x*y; } struct edge{ int to,dis; edge(int to,int dis):to(to),dis(dis){} }; int q[201],C[201],g[201],U[201],h,vis[201],t,ppp[201]; vector<edge> e[201]; int main(){ int n=read(),m=read(); for(int i=1;i<=n;i++){ C[i]=read(); U[i]=read(); if(C[i]) ppp[i]=1; } for(int i=1;i<=m;i+=1){ int u=read(),v=read(),dis=read(); e[u].push_back(edge(v,dis)); g[v]++; } for(int i=1;i<=n;i+=1){ int o=0; for(int j=1;j<=n;j+=1) if(g[j]==0 && !vis[j]){o=j; break;} vis[o]=1; if(!ppp[o]) C[o]-=U[o]; if(C[o]>0) for(int j=0;j<e[o].size();j+=1) g[e[o][j].to]--,C[e[o][j].to]+=C[o]*e[o][j].dis; } int tot=0; for(int i=1;i<=n;i+=1) if(e[i].empty() && C[i]>0) tot+=1,printf("%d %d\n",i,C[i]); if(tot==0) printf("NULL"); return 0; }
时间: 2024-11-05 13:33:03