QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#187122#3855. Regional developmentwind_whisper#WA 0ms3688kbC++142.0kb2023-09-24 14:45:582023-09-24 14:45:59

Judging History

你现在查看的是最新测评结果

  • [2023-09-24 14:45:59]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:3688kb
  • [2023-09-24 14:45:58]
  • 提交

answer

#include <stdio.h>
#define ll long long
#define MN 100010
#define MM 100010
#define inf 99999999
int fr[MN],ne[MM],v[MM],w[MM],li[MM],bs=0,dy[MN];
void add(int a,int b,int c)
{
    v[bs]=b;
    w[bs]=c;
    ne[bs]=fr[a];
    fr[a]=bs++;
}
void addb(int a,int b,int c)
{
    add(a,b,c);
    add(b,a,0);
}
bool bk[MN];int jl[MN],S,T,N,dl[MN];
bool bfs()
{
    for(int i=1;i<=N;i++)
        bk[i]=0,jl[i]=inf;
    bk[S]=1;int he=0,ta=1;
    dl[0]=S,jl[S]=0;
    while(he<ta)
    {
        int u=dl[he++];
        for(int i=fr[u];i!=-1;i=ne[i])
        {
            if(w[i]>0&&!bk[v[i]])
            {
                bk[v[i]]=1;
                jl[v[i]]=jl[u]+1;
                dl[ta++]=v[i];
            }
        }
    }
    return jl[T]<inf;
}
int dfs(int u,int z)
{
    if(u==T)return z;
    for(int &i=dy[u];i!=-1;i=ne[i])
    {
        int t=v[i];
        if(jl[t]==jl[u]+1&&w[i]>0)
        {
            int rt=dfs(t,z<w[i]?z:w[i]);
            if(rt!=-1)
            {
                w[i]-=rt;li[i]+=rt;w[i^1]+=rt;
                return rt;
            }
        }
    }
    return -1;
}
int dinic()
{
    int jg=0;
    while(bfs())
    {
        for(int i=1;i<=N;i++)dy[i]=fr[i];
        while(1)
        {
            int rt=dfs(S,inf);
            if(rt==-1)break;
            jg+=rt;
        }
    }
    return jg;
}
int cz[MN];
int main()
{
    int n,m,M;
    scanf("%d%d%d",&n,&m,&M);
    for(int i=1;i<=n+2;i++)fr[i]=-1;
    N=n+2;S=N-1;T=N;
    for(int i=0;i<m;i++)
    {
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        cz[a]-=c;cz[b]+=c;
        addb(b,a,1);
    }
    int nd=0;
    for(int i=1;i<=n;i++)
    {
        int t=cz[i]/M;
        if(t>0)addb(S,i,t),nd+=t;
        else if(t<0)addb(i,T,-t);
    }
    int rt=dinic();
    if(rt<nd)
    {
        printf("IMPOSSIBLE\n");
        return 0;
    }
    for(int i=0;i<m;i++)
    {
        int t=li[i*2]-li[i*2+1];
        printf("%d\n",-t*M);
    }
    return 0;
}

详细

Test #1:

score: 0
Wrong Answer
time: 0ms
memory: 3688kb

input:

10 23 3
2 10 1
2 6 1
6 9 1
7 9 1
6 7 1
3 6 1
1 3 1
1 6 2
6 10 1
2 9 1
4 9 2
4 7 2
3 10 2
3 9 1
6 8 1
7 8 2
3 5 1
5 9 1
8 9 2
3 8 2
1 5 2
1 4 1
5 10 2

output:

-3
0
0
0
0
0
-3
0
0
0
-3
0
-3
-3
0
0
0
-3
0
-3
-3
0
0

result:

wrong answer weight could not be 0