问题标题: 洛谷:P4329 [COCI2006-2007#1] Bond 15分求助

1
0
已解决
陆麟瑞
陆麟瑞
资深天翼
资深天翼

AC前三个点,后面全WA。

本萌新刚学费用流,求dalao指教qwq

貌似是精度出现了问题。

各位dalao提供也可以提供hack数据。

错误代码:

#include <iostream>  
#include <queue>  
#include <cstring>
#include <cmath>  
#include <cstdio>
using namespace std;  
int maxData = 0x7fffffff; 
int head[5001],net[100001],to[100001],cap[100001];
long double cost[100001];
int cnt=1;
void add(int x,int y,int c,long double z)
{
    to[++cnt]=y;
    cost[cnt]=z;
    cap[cnt]=c;
    net[cnt]=head[x];
    head[x]=cnt;
}
int flow[5001];
int pre[5001];
int xb[5001];
int n,m;
int mflow=0;
long double mcost=0;
long double dis[5001];
int vis[5001];
int BFS(int s,int t)
{
    for(int i=0; i<=t; i++)
    dis[i]=100000000;
    memset(vis,0,sizeof(vis));
    int INF=dis[0];
    queue<int>q;
    for(int i=s;i<=t;i++)
    {
        pre[i]=-1;
        xb[i]=-1;
    }
    vis[s]=1;
    dis[s]=0;
    pre[s]=0;
    flow[s]=maxData;
    q.push(s);
    while(!q.empty())
    {
        int v=q.front();
        q.pop();
        vis[v]=0;
        for(int i=head[v];i;i=net[i])
        {
            int tmp=to[i];
            if(cap[i]>0&&dis[tmp]>dis[v]+cost[i])
            {
              dis[tmp]=dis[v]+cost[i];
              pre[tmp]=v;
              xb[tmp]=i;
              flow[tmp]=min(flow[v],cap[i]);
              if(!vis[tmp]) vis[tmp]=1,q.push(tmp);
            }
        }
    }
    //cout<<dis[t]<<endl;
    if(dis[t]>=INF) return 0;
    return 1;
}
void max_flow(int s,int t)
{
    mcost=1;
    while(BFS(s,t))
    {
        int k=t;
        while(k!=s)
         {
             cap[xb[k]]-=flow[t];
             cap[xb[k]^1]+=flow[t];
             k=pre[k];
         } 
        mflow+=flow[t];
        mcost*=flow[t]*dis[t];
        //cout<<1<<endl;
    }
}
int main()
{
    int s,t;
    cin>>n;
     for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++)
        {
            long double c;
            cin>>c;
            c=c/100.00000;
            add(i,j+n,1,-c);
            add(j+n,i,0,c);
        }    
    s=0,t=n*n+1;
    for(int i=1; i<=n; ++i) add(s,i,1,0),add(i,s,0,0),add(i+n,t,1,0),add(t,i+n,0,0);
    max_flow(s,t);
    mcost=abs(mcost);
    printf("%.8Lf",mcost*100,00000);
    return 0;
}
陆麟瑞在2018-07-30 07:58:58追加了内容

@葛新  @李庚午 @刘孟博 @王星河 


0
已采纳
赵逸凡
赵逸凡
初级启示者
初级启示者

如果精度不够高,那就把整形数组改大或者变成字符串数组。

我是蒟蒻

赵逸凡在2018-07-30 09:13:57追加了内容

建议把92行c/100.00000改成c/ctd,定义long double,ctd=100.00000

这么难的洛谷题,能跟酷町堂的难度5的最难的题相比。

赵逸凡在2018-07-30 09:14:04追加了内容

建议把92行c/100.00000改成c/ctd,定义long double,ctd=100.00000

这么难的洛谷题,能跟酷町堂的难度5的最难的题相比。

赵逸凡在2018-07-30 09:16:14追加了内容

建议你看一下洛谷官方题解,上面说什么二分图,网络流,n=20精度必须很高,看不懂。

赵逸凡在2018-07-30 09:19:40追加了内容

二分,惊人的事情--蒋智航!!!

0
0
0
0
我要回答