求助第二个测试点
查看原帖
求助第二个测试点
465435
ykily楼主2021/5/26 20:29
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 10010
using namespace std;
int C[N];//状态 
int U[N];//阀值
int tuopu[N];
int as[N];
int rudu[N];
int n,p,cnt=0;
int hed=0,tail=0;
struct edge
{
   int to,next,W;//to aim, next lastpoint, W long
}edge[N];
int head[N];

   void add_edge(int u,int v,int w)
        {
	       edge[cnt].to=v;
	       edge[cnt].W=w;
		   edge[cnt].next=head[u];
	   	   head[u]=cnt++;	
	  	   return;
        }

inline int read()
{
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9')
	 {
		if(ch=='-')
		 f=-1;
		ch=getchar();
	 }
	while(ch>='0'&&ch<='9')
	 {
	 	x=(x<<1)+(x<<3)+(ch^48);
	 	ch=getchar();
	 }
	return x*f;
}

void topu()
 {
   while(tail!=n)
    {
      ++hed;
      for(int i=head[tuopu[hed]];i!=-1;i=edge[i].next)
       {
       	 --rudu[edge[i].to];
       	  if(C[tuopu[hed]]!=0)
       	   	C[edge[i].to]+=edge[i].W;
       	 if(rudu[edge[i].to]==0)
       	  {
       	  	tuopu[++tail]=edge[i].to;
       	  	C[tuopu[tail]]-=U[tuopu[tail]];
       	  	 if(C[tuopu[tail]]>0) continue;
       	  	  C[tuopu[tail]]=0;
       	  }
       }
    }
 }

void ans()
 {
   int sum=0,l=0;
   //sum 判断是否为输出层,l 记录输出层数 
   for(int i=n;i!=0;--i)
    {
      sum=0;
      for(int j=head[tuopu[i]];j!=-1;j=edge[j].next)
       {
        ++sum;
		if(sum!=0) break;
       }
       if(sum!=0) continue;
	  if(C[tuopu[i]]!=0)
      as[++l]=tuopu[i];
    }
    if(l==0)
     {
     	cout<<"NULL";return;
     }
    else
     {
     	sort(as+1,as+l+1);
     	for(int i=1;i<=l;++i)
     	 cout<<as[i]<<" "<<C[as[i]]<<endl;
     	 return;
     }
 }

int main()
{
  n=read();p=read();
  for(int i=1;i<=n;++i)
   {
    C[i]=read();U[i]=read();head[i]=-1;
    rudu[i]=0;
   }//初始化 
  int u,v,w;
  for(int i=1;i<=p;++i)
   {
   	 u=read();v=read();w=read();
   	 add_edge(u,v,w);
   	 ++rudu[v];
   }
   for(int i=1;i<=n;++i)
    {
      if(rudu[i]==0)
       tuopu[++tail]=i;
    }
   topu();
   ans();
   return 0;
}
2021/5/26 20:29
加载中...