矩阵写的。。运行有点慢。。。邻接表老是超时。。。不知为何。。。先放吧。。。懂了在写。。。。
用天使矩阵的行对列匹配。、。。。可以建一个起点终点。。。。
#include<stdio.h> #include<string.h> #include <iostream> using namespace std; #define INF 1<<29; int s,t; //s:源点 t:汇点 int m; //顶点数 int cf[605][605]; //残留容量 int flow; //当前最大流 int cf_path; //本次可增广的流量(本次增广路径的残留容量) bool flag; //本次增广路径是否找到 int vh[1000]; //各高度的顶点个数 int h[1000]; //各顶点的高度,又称为“距离标号”——到汇点距离的下界(边权值都为1) void sap() { flow =cf_path=s=t=0; flag=false; memset(cf,0,sizeof(cf)); memset(vh,0,sizeof(vh)); memset(h,0,sizeof(h)); } void find_path_sap(int cur) { if(cur==t) { flow++; flag=true; return; } int i; int minH=m*2; int tmp_cf_path=cf_path; for(i=0;i<=m;i++) { if(cf[cur][i]) { if(h[i]+1==h[cur]) { find_path_sap(i); if(h[1]>=m) return; if(flag) break;//此句不加会错、、、 } if(h[i]<minH) minH=h[i]; } } if(flag) { cf[cur][i]--; cf[i][cur]++; } else { vh[h[cur]]--; if(vh[h[cur]]==0) h[0]=m; h[cur]=minH+1; vh[h[cur]]++; } } int solve() { vh[0]=m; flow=0; while(h[0]<m)//h[1]保持<m,一旦增长到m,就不再存在任何增广路径 { flag=false; cf_path=INF; find_path_sap(s); } return flow; } void addEdge(int x,int y,int c) { cf[x][y]+=c; } int main() { //freopen("Input.txt","r",stdin); int mm,a; scanf("%d",&a); while(a--) { int cn,n; scanf("%d%d",&cn,&n); sap(); mm=cn+n+3; s=0; t=mm; m=mm; int i,cf=0,kf=0; for(i=1;i<=cn;i++) { int c; scanf("%d",&c); cf+=c; addEdge(0,i,c); for(int j=cn+1;j<=cn+n;j++) addEdge(i,j,1); } for(i=cn+1;i<=cn+n;i++) { int x; scanf("%d",&x); kf+=x; addEdge(i,cn+n+3,x); } if(cf!=kf) printf("Terrible\n"); else { int hs; hs=solve(); if(cf==hs) printf("Not Sure\n"); else printf("Terrible\n"); } } return 0; }