nyoj 哭泣天使 最大流

来源:互联网 发布:iphone是否允许网络 编辑:程序博客网 时间:2024/06/05 09:26

要考试了,可是不想复习怎么办?

是各种事情要做,但是自己总有各种理由不想做然后不去做。看来一件事情如果不想做的话那个都是理由啊!

今天又是用了这样那样的理由使得自己一天没有去上自习而在宿舍待着,什么时候能够真的去控制自己才算长大了吧!今天是儿童节,看了还是没有长大,祝大家儿童节快乐吧!

废话有有点说的多了,进入正题。

题意就不用说了,是典型的最大流问题,如果流和天使微笑的数量相同就是不确定,不同则是Terrible

直接贴的模板。虽然自己写的模板真的是太长了,而且别人既有可能是看不懂的 啊!

下面的是代码:

 #include<iostream>#include<cstdio>#include<string>#include<cstring>#include<cmath>#include<algorithm>#include<queue>#include<stack>#include<vector>#include<climits>#include<map>using namespace std;#define rep(i,n) for(int i=0; i<n; i++)#define repf(i,n,m) for(int i=(n); i<=(m); ++i)#define repd(i,n,m) for(int i=(n); i>=(m); --i)#define max(a,b) (a)>(b)?(a):(b)#define min(a,b) (a)<(b)?(a):(b)#define fab(a) ((a)>0?(a):(0-(a)))#define ll long long#define arc(a) ((a)*(a))#define inf 10000000#define exp 0.000001#define N 1000int n,m,l,len,s,t;struct node{int x,y,e,pre;}a[200000];int pre[N+10];int que[10000];int stage[N+10];void addpage(int i,int j,int e){   a[len].x=i; a[len].y=j;   a[len].e=e; a[len].pre=pre[i];   pre[i]=len++;}bool bfs(int s,int t){queue<int>q;memset(stage,-1,sizeof(stage));stage[s]=0; q.push(s);while(!q.empty()){int x=q.front();q.pop();for(int i=pre[x]; i!=-1; i=a[i].pre)if(a[i].e>0 && stage[a[i].y]==-1){stage[a[i].y]=stage[a[i].x]+1;q.push(a[i].y);if(a[i].y==t) return true;}}return false;}int dfs(int s,int t){    int sum=0;    while(bfs(s,t))    {       int tail=0,u=s,i;        while(true)        {                   if(u==t)                   {                           int tmp=inf,mark;                           rep(i,tail)                             if(a[que[i]].e<tmp)                             {                                  mark=i; tmp=a[que[i]].e;                             }                           rep(i,tail)                           {                              a[que[i]].e-=tmp;                              a[que[i]^1].e+=tmp;                              }                           sum+=tmp;                           tail=mark;                           u=a[que[tail]].x;                   }              for(i=pre[u]; i!=-1; i=a[i].pre)              {                  int y=a[i].y; if(stage[y]==-1) continue;                  if(stage[y]==stage[u]+1 && a[i].e>0)                      break;              }              if(i!=-1)              {                 que[tail++]=i;                 u=a[i].y;                 }                 else                 {                      if(tail==0) break;                      stage[u]=-1;                      u=a[que[--tail]].x;                      }        }    }    return sum;}int main(){ int test,x,sum,pp;scanf("%d",&test);int s,t;while(test--){scanf("%d%d",&n,&m);s=0; t=m+n+1;len=0;sum=0;pp=0;memset(pre,-1,sizeof(pre));repf(i,1,n){scanf("%d",&x); addpage(s,i,x);addpage(i,s,0);sum+=x;}repf(i,n+1,n+m){scanf("%d",&x); addpage(i,t,x); addpage(t,i,0),pp+=x;}if(pp!=sum){printf("Terrible\n"); continue;}repf(i,1,n)repf(j,n+1,n+m){addpage(i,j,1); addpage(j,i,0);}int tmp=dfs(s,t);//cout<<tmp<<endl;        // cout<<sum<<endl;if(tmp==sum)printf("Not Sure\n");elseprintf("Terrible\n");}   return 0;}