原题地址:点击打开链接
Foed-Fulkerson算法会超时,这里我们用Dinic算法
#include<stdio.h> #include<string.h> #include<queue> using namespace std; int map[700][700],len[700],pos[700]; #define min(x,y)(x<y?x:y) bool bfs(int s,int t) //分层 { int i; memset(len,-1,sizeof(len)); queue<int>que; que.push(s); len[s]=0; while(!que.empty()) { int u=que.front(); que.pop(); for(i=0;i<=t;i++) { if(map[u][i]>0 && len[i]<0) { len[i]=len[u]+1; que.push(i); } } } if(len[t]>-1) return true; return false; } int dfs(int u,int t,int f) //寻找增广路 { if(u==t) return f; for(int &i=pos[u];i<=t;i++) //注意该处的引用,意思就是从上次遍历过的地方开始 { if(map[u][i]>0 && len[u]<len[i]) { int d=dfs(i,t,min(map[u][i],f)); if(d>0) { map[u][i]-=d; map[i][u]+=d; return d; } } } return 0; } int max_flow(int s,int t) { int res=0; while(bfs(s,t)) { memset(pos,0,sizeof(pos)); while(1) { int d=dfs(s,t,99999); if(d<=0) break; res+=d; } } return res; } int main() { int i,j,c,x,m,n,s,t,sum1,sum2; //s源点 t汇点 scanf("%d",&c); while(c--) { s=0; sum1=0; sum2=0; memset(map,0,sizeof(map)); scanf("%d%d",&m,&n); t=m+n+1; for(i=1;i<=m;i++) { scanf("%d",&x); sum1+=x; map[s][i]=x; } for(i=1;i<=n;i++) { scanf("%d",&x); sum2+=x; map[m+i][t]=x; } if(sum1!=sum2) { printf("Terrible\n"); continue; } for(i=1;i<=m;i++) for(j=m+1;j<=m+n;j++) map[i][j]=1; int res=max_flow(s,t); if(res==sum1) printf("Not Sure\n"); else printf("Terrible\n"); } return 0; }