zoukankan      html  css  js  c++  java
  • hdu1853 km算法

      1 //hdu1853 
      2 #include<stdio.h>
      3 #include<string.h>
      4 #define INF 99999999
      5 int map[103][103],pr[103],pl[103],visr[103],visl[103],slack[103],match[103];
      6 int n,m;
      7 int dfs(int u)
      8 {
      9     int i,j,val;
     10 
     11     visl[u]=1;
     12     for(i=1;i<=n;i++)
     13     {
     14         if(!visr[i])
     15         {
     16             val=pr[i]+pl[u]-map[u][i];
     17             if(val==0)
     18             {
     19                 visr[i]=1;
     20                 if(match[i]==-1||dfs(match[i]))
     21                 {
     22                     match[i]=u;
     23                     return 1;
     24                 }
     25             }
     26             if(val>0&&slack[i]>val)
     27                 slack[i]=val;
     28         }
     29     }
     30     return 0;
     31 }
     32 void km()
     33 {
     34     int i,j,res=0,d;
     35     for(i=0;i<=n;i++)
     36         pl[i]=INF;
     37     memset(pr,0,sizeof(pr));
     38     memset(match,-1,sizeof(match));
     39     for(i=1;i<=n;i++)
     40     {
     41         for(j=1;j<=n;j++)
     42             slack[j]=INF;
     43         while(1)
     44         {
     45             memset(visr,0,sizeof(visr));
     46             memset(visl,0,sizeof(visl));
     47             if(dfs(i))
     48                 break;
     49             d=INF;
     50             for(j=1;j<=n;j++)
     51             {
     52                 if(!visr[j]&&d>slack[j])
     53                     d=slack[j];
     54             }
     55             for(j=1;j<=n;j++)
     56             {
     57                 if(visr[j])
     58                     pr[j]+=d;
     59                 if(visl[j])
     60                     pl[j]-=d;
     61             }
     62         }
     63     }
     64 }
     65 int main()
     66 {
     67     int i,j;
     68     while(scanf("%d%d",&n,&m)!=EOF)
     69     {
     70         for(i=0;i<=n;i++)
     71             for(j=0;j<=n;j++)
     72                 map[i][j]=-INF;
     73 
     74         for(i=0;i<m;i++)
     75         {
     76             int x,y,z;
     77             scanf("%d%d%d",&x,&y,&z);
     78             if(map[x][y]<-z)
     79             {
     80                 map[x][y]=-z;
     81             }
     82         }
     83         /*for(i=1;i<=n;i++)
     84         {
     85             for(j=1;j<=n;j++)
     86                 printf("%d ",map[i][j]);
     87             printf("
    ");
     88         }*/
     89         km();
     90         int flag=1;
     91         int res=0;
     92         for(i=1;i<=n;i++)
     93         {
     94             if(map[match[i]][i]==-INF)
     95             {flag=0;break;}
     96             else res+=map[match[i]][i];
     97         }
     98         if(!flag)printf("-1
    ");
     99         else
    100          printf("%d
    ",-res);
    101     }
    102 }
  • 相关阅读:
    Js实现页面处理器
    自定类型转换
    为什么PHP5中保存cookie以后,要刷新一次才能读取cookie的内容?
    PHP不不支持函数重载
    JS 省市区三级联动
    我喜欢的酷站
    网站宽度设置多少
    Windows环境下Node.js 以及NPM和CoffeeScript的安装配置
    HTML中Meta详解
    搭建SVN
  • 原文地址:https://www.cnblogs.com/sweat123/p/4535986.html
Copyright © 2011-2022 走看看