題意:有一個n行m列的數列,每行元素和的值和每列元素和的值給了你,下面有元素取值的限制條件,如0 0 > 1代表的是這個數列的所有元素都大於1,0代表的就是所有,0 1就是所有行的第一個元素,1 0就是第一行,然後判斷是數列在滿足這些條件的情況下是否有解
思路:給的條件就是給你上界和下界,然後這題是有源匯點的,源點連行,列連匯點,與HDU4975類似hdu 4975,然後就是將有源匯點的變成無源匯的,只需連一條匯點到源點的inf邊即可,然後與無源匯的做法一樣,建議不會無源匯的先去學習學習,然後判斷是否滿流來判斷有沒有解,但是最後我們還要將源點與匯點的邊去掉在跑一遍源點到匯點,這是因為之前只是判斷有沒有解,但是網絡裡還有可以繼續流的可能,跑完後才是將所有和分到所
#include#include #include #include #include #include #include #include using namespace std; typedef long long ll; const int inf=0x3f3f3f3f; const int maxn=260; struct edge{ int to,cap,rev; edge(){} edge(int a,int b,int c){to=a;cap=b;rev=c;} }; vector G[maxn]; int level[maxn],iter[maxn],flag; void add_edge(int from,int to,int cap){ G[from].push_back(edge(to,cap,G[to].size())); G[to].push_back(edge(from,0,G[from].size()-1)); } void bfs(int s){ memset(level,-1,sizeof(level)); queue que; level[s]=0;que.push(s); while(!que.empty()){ int v=que.front();que.pop(); for(unsigned int i=0;i 0&&level[e.to]<0){ level[e.to]=level[v]+1; que.push(e.to); } } } } int dfs(int v,int t,int f){ if(v==t) return f; for(int &i=iter[v];i 0&&level[v] 0){ e.cap-=d; G[e.to][e.rev].cap+=d; return d; } } } return 0; } int max_flow(int s,int t){ int flow=0; while(1){ bfs(s); if(level[t]<0) return flow; memset(iter,0,sizeof(iter)); int f; while((f=dfs(s,t,inf))>0) flow+=f; } } int L[maxn][maxn],R[maxn][maxn],n,m; void slove(int ask){ int a,b,d; char ch; for(int k=0;k'){ for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ if(R[i][j+n]<=d) flag=1; L[i][j+n]=max(L[i][j+n],d+1); } }else if(ch=='='){ for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ if(L[i][j+n]>d) flag=1; if(R[i][j+n] =d) flag=1; R[i][j+n]=min(R[i][j+n],d-1); } } } if(a==0&&b!=0){ if(ch=='>'){ for(int i=1;i<=n;i++){ if(R[i][b+n]<=d) flag=1; L[i][b+n]=max(L[i][b+n],d+1); } }else if(ch=='='){ for(int i=1;i<=n;i++){ if(L[i][b+n]>d) flag=1; if(R[i][b+n] =d) flag=1; R[i][b+n]=min(R[i][b+n],d-1); } } } if(b==0&&a!=0){ if(ch=='>'){ for(int i=1;i<=m;i++){ if(R[a][i+n]<=d) flag=1; L[a][i+n]=max(L[a][i+n],d+1); } }else if(ch=='='){ for(int i=1;i<=m;i++){ if(L[a][i+n]>d) flag=1; if(R[a][i+n] =d) flag=1; R[a][i+n]=min(R[a][i+n],d-1); } } } if(a!=0&&b!=0){ if(ch=='>'){ if(R[a][b+n]<=d) flag=1; L[a][b+n]=max(L[a][b+n],d+1); }else if(ch=='='){ if(R[a][b+n] d) flag=1; L[a][b+n]=R[a][b+n]=d; }else if(ch=='<'){ if(L[a][b+n]>=d) flag=1; R[a][b+n]=min(R[a][b+n],d-1); } } } } int num[10010][5]; int main(){ int T1,a,ask; scanf("%d",&T1); while(T1--){ scanf("%d%d",&n,&m); for(int i=0;i