zoukankan      html  css  js  c++  java
  • HDU 4975 A simple Gaussian elimination problem.

    http://acm.hdu.edu.cn/showproblem.php?pid=4975

    题意:同HDU 4888。给N行M列,每行之和,每列之和,判断矩阵是不是唯一。

    题解:网络流。源点和每行之和建边,容量为和;汇点和没列之和建边,容量为和;行之和和列之和建边,容量为9(每位只能是0~9)。

        判断可行性:行之和的和是否等于列之和的和;是否满流。

        判断唯一解:残留网络里是否有长度大于等于2的环

      1 #include <cstdio>
      2 #include <cstring>
      3 #include <iostream>
      4 #include <cstdlib>
      5 #include <string>
      6 #include <algorithm>
      7 #include <vector>
      8 #include <map>
      9 #include <set>
     10 #include <queue>
     11 #include <stack>
     12 #include <cmath>
     13 #include <ctime>
     14 #include <functional>
     15 #include <cctype>
     16 
     17 using namespace std;
     18 
     19 typedef __int64 ll;
     20 
     21 const int INF=0xfffffff;
     22 
     23 const int maxm=500*500*10+10;
     24 const int maxn=510+510;
     25 
     26 struct edge{
     27     int to,cap,next;
     28     edge(int to=0,int cap=0,int next=0):to(to),cap(cap),next(next){}
     29 }G[maxm];
     30 int head[maxn],level[maxn];
     31 bool used[maxn];
     32 int g[maxn][maxn];
     33 int sumr,sumc;
     34 int N,M;
     35 int flag;
     36 int idx;
     37 int s,t;
     38 
     39 void add_edge(int from,int to,int cap)
     40 {
     41     G[++idx]=edge(to,cap,head[from]);
     42     head[from]=idx;
     43     G[++idx]=edge(from,0,head[to]);
     44     head[to]=idx;
     45 }
     46 
     47 bool bfs(int S,int T)
     48 {
     49     memset(level,0xff,sizeof(level));
     50     level[S]=0;
     51     queue<int> q;
     52     q.push(S);
     53     while(!q.empty())
     54     {
     55         int v=q.front();
     56         q.pop();
     57         for(int k=head[v];k!=-1;k=G[k].next)
     58         {
     59             edge &e=G[k];
     60             if(level[e.to]==-1&&e.cap){
     61                 level[e.to]=level[v]+1;
     62                 q.push(e.to);
     63             }
     64         }
     65     }
     66     return level[T]!=-1;
     67 }
     68 
     69 int dfs(int v,int f,int T)
     70 {
     71     if(v==T||f==0) return f;
     72     int flow=0;
     73     for(int k=head[v];k!=-1;k=G[k].next)
     74     {
     75         edge &e=G[k];
     76         if(level[e.to]==level[v]+1){
     77             int d;
     78             if((d=dfs(e.to,min(f,e.cap),T))>0){
     79                 G[k].cap-=d;
     80                 G[k^1].cap+=d;
     81                 flow+=d;
     82                 f-=d;
     83                 if(f==0) return flow;
     84             }
     85         }
     86     }
     87     level[v]=-1;
     88     return flow;
     89 }
     90 
     91 int max_flow(int s,int t)
     92 {
     93     int flow=0;
     94     int f;
     95     while(bfs(s,t)==1)
     96     {
     97         while((f=dfs(s,INF,t))>0)
     98         {
     99             flow+=f;
    100         }
    101     }
    102     return flow;
    103 }
    104 
    105 int dfs_loop(int u,int rev)
    106 {
    107     for(int &k=head[u];k!=-1;k=G[k].next)
    108     {
    109         if(k==(rev^1)) continue;
    110         if(G[k].cap){
    111             if(used[G[k].to]) return 1;
    112             used[G[k].to]=true;
    113             if(dfs_loop(G[k].to,k)==1) return 1;
    114             used[G[k].to]=false;
    115         }
    116     }
    117     return 0;
    118 }
    119 
    120 int judge()
    121 {
    122     for(int i=1;i<=N;i++)
    123     {
    124         if(dfs_loop(i,-1)) return 0;
    125     }
    126     return 1;
    127 }
    128 
    129 void init()
    130 {
    131     idx=-1;
    132     memset(head,0xff,sizeof(head));
    133     memset(used,0,sizeof(used));
    134     sumr=0;
    135     sumc=0;
    136     flag=0;
    137 }
    138 
    139 int main() {
    140     int T;
    141     scanf("%d",&T);
    142     for(int ca=1;ca<=T;ca++)
    143     {
    144         init();
    145         printf("Case #%d: ",ca);
    146         scanf("%d%d",&N,&M);
    147         s=0;
    148         t=N+M+1;
    149         int cr;
    150         for(int i=1;i<=N;i++)
    151         {
    152             scanf("%d",&cr);
    153             sumr+=cr;
    154             add_edge(s,i,cr);
    155             for(int j=1;j<=M;j++)
    156             {
    157                 add_edge(i,N+j,9);
    158             }
    159         }
    160         int cc;
    161         for(int i=1;i<=M;i++)
    162         {
    163             scanf("%d",&cc);
    164             sumc+=cc;
    165             add_edge(N+i,t,cc);
    166         }
    167         int maxflow=max_flow(s,t);
    168         if(sumr!=sumc) puts("So naive!");
    169         else if(sumr!=maxflow) puts("So naive!");
    170         else if(!judge()) puts("So young!");
    171         else puts("So simple!");
    172     }
    173     return 0;
    174 }
  • 相关阅读:
    Jmeter——引入第三方jar包
    Linux系统中安装和卸载node
    Element和Event中的各种offsetTop,clientTop,scrollTop等位置
    关于Linux下LaTeX无法找到已安装字体的问题与解决
    Ubuntu 21.04 使用命令行分配静态IP地址
    批量下载YouTube播放列表(playlist)视频、字幕
    修改tomcat的server.xml,context.xml文件后又自动还原问题
    Echarts legend属性设置
    剑指-30:包含min函数的栈
    无网安装Docker及Docker镜像的导入导出
  • 原文地址:https://www.cnblogs.com/der-z/p/3930723.html
Copyright © 2011-2022 走看看