HDU 2448 Mining Station on the sea(KM算法)

来源:互联网 发布:新浪微博推广淘宝店铺 编辑:程序博客网 时间:2024/05/16 15:43
一开始两种放个矩阵里,不知道那里错了,一直调不对,放一个矩阵就好了。
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;typedef long long LL;const int maxn=200+5;const int inf=(1<<30);int w[maxn][maxn];int lx[maxn],ly[maxn];int s[maxn],t[maxn];int slack[maxn];int match[maxn];int n,m,k,p;int G[maxn*2][maxn*2];int boat[maxn];bool find(int i){    s[i]=true;    for(int j=1;j<=n;j++)    {        if(t[j]) continue;        int tmp=lx[i]+ly[j]-w[i][j];        if(tmp==0)        {            t[j]=true;            if(match[j]==-1||find(match[j]))            {                match[j]=i;                return true;            }        }        else if(slack[j]>tmp) slack[j]=tmp;    }    return false;}void update(){    int d=inf;    for(int i=1;i<=n;i++)        if(!t[i]&&d>slack[i]) d=slack[i];    for(int i=1;i<=n;i++)        if(s[i]) lx[i]-=d;    for(int i=1;i<=n;i++){        if(t[i]) ly[i]+=d;        else slack[i]-=d;    }}void KM(){    memset(match,-1,sizeof(match));    memset(ly,0,sizeof(ly));    for(int i=1;i<=n;i++)    {        lx[i]=-inf;        for(int j=1;j<=n;j++)            if(w[i][j]>lx[i]) {lx[i]=w[i][j];}    }    for(int i=1;i<=n;i++)    {        for(int j=1;j<=n;j++) slack[j]=inf;        for(;;)        {            memset(s,0,sizeof(s));            memset(t,0,sizeof(t));            if(find(i)) break;else update();        }    }  }void floyd(){    for(int k=1;k<=m+n;k++)    {        for(int i=1;i<=m+n;i++)        {            for(int j=1;j<=m+n;j++)            {                if(G[i][k]<inf&&G[k][j]<inf) G[i][j]=min(G[i][j],G[i][k]+G[k][j]);            }        }    }}int main(){    while(~scanf("%d%d%d%d",&n,&m,&k,&p))    {        for(int i=1;i<=n+m;i++) for(int j=1;j<=n+m;j++) G[i][j]=inf;        for(int i=1;i<=m;i++) G[i][i]=0;        memset(w,0,sizeof(w));        for(int i=1;i<=n;i++) scanf("%d",&boat[i]);        for(int i=1;i<=k;i++){            int x,y,d;            scanf("%d%d%d",&x,&y,&d);            G[x+n][y+n]=G[y+n][x+n]=d;        }        for(int i=1;i<=p;i++){            int x,y,d;            scanf("%d%d%d",&x,&y,&d);            G[x][y+n]=d;        }        floyd();        for(int i=1;i<=n;i++)        {            for(int j=1;j<=n;j++){                w[i][j]=-G[i][boat[j]+n];            }        }        KM();        int ans=0;        for(int i=1;i<=n;i++) ans+=w[match[i]][i];        printf("%d\n",-ans);    }    return 0;}

0 0