Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

谁帮我看一下代码啊?不胜感激,一直在WA

Posted by whlacm at 2011-03-13 18:48:09 on Problem 3436
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
#define INF 0x7f7f7f7f
#define T 2*N+1
#define min(a,b) ((a)<(b))?(a):(b)
struct Machine{
int Q,input[11],output[11];
}machine[55];
int P,N;
int map[150][150];
bool visit[150];
int layer[150];
int sta[150];
int ans,size,num;
struct Conection
{
    int x,y;
    int dd;
}conection[30000];
int coun;
void input()
{
    int i,j;
    for(i=1;i<=N;i++)
    {
        cin>>machine[i].Q;
        for(j=0;j<P;j++)
        cin>>machine[i].input[j];
        for(j=0;j<P;j++)
        cin>>machine[i].output[j];
        map[i][i+N]+=machine[i].Q;
    }
}
bool judge(int in[10],int out[10])
{
    int i;
    for(i=0;i<P;i++)
    {
        if(in[i]==out[i]||in[i]==2||out[i]==2)
        continue;
        return false;
    }
    return true;
}
void build()
{
    int i,j;
    for(i=1;i<=N;i++)
    {
        for(j=i+1;j<=N;j++)
        {
            if(judge(machine[i].input,machine[j].output))
            map[j+N][i]=INF;
            if(judge(machine[i].output,machine[j].input))
            map[i+N][j]=INF;
        }
        bool flag1=true;
        bool flag2=true;
        for(j=0;j<P;j++)
        {
            if(machine[i].input[j]==1)
            {
                flag1=false;
            }
            if(machine[i].output[j]!=1)
            {
                flag2=false;
            }
        }
        if(flag1)map[0][i]=INF;
        if(flag2)map[i+N][T]=INF;
    }
}
void out()
{
    int i;
    for(i=0;i<=coun;i++)
    {
        cout<<conection[i].x<<" "<<conection[i].y<<" "<<conection[i].dd<<endl;
    }
}
bool dfs(int s,int t)
{
    //cout<<"eee"<<endl;
    bool temp;
    sta[size]=s;
    if(s==t)
    {
        int d=INF;
        for(int i=0;i<size;i++)
        {
            if(map[sta[i]][sta[i+1]]<d)
            {
                d=map[sta[i]][sta[i+1]];
                num=sta[i];
            }
        }
        ans+=d;
        for(int i=0;i<size;i++)
        {
            map[sta[i]][sta[i+1]]-=d;
            map[sta[i+1]][sta[i]]+=d;
            if(0<sta[i]&&sta[i]<T&&sta[i+1]>0&&sta[i+1]<T)
            {
                if((sta[i]%N)!=(sta[i+1]%N))
                {
                    ++coun;
                    if(sta[i]%N==0)
                    {
                        conection[coun].x=N;
                        conection[coun].y=sta[i+1]%N;
                    }
                    if(sta[i+1]%N==0)
                    {
                        conection[coun].x=sta[i]%N;
                        conection[coun].y=N;
                    }
                    else
                    {
                        conection[coun].x=sta[i]%N;
                        conection[coun].y=sta[i+1]%N;
                    }
                    conection[coun].dd=d;
                }
            }
        }
        return 1;
    }
    for(int i=0;i<=T;i++)
    {
        if(layer[i]==layer[s]+1&&map[s][i]>0)
        {
            size++;
            temp=dfs(i,t);
            size--;
            if(temp&&num!=s)return 1;
        }
    }
    return 0;
}
bool bfs(int s,int t)
{
    int p;
    queue<int>Q;
    memset(visit,false,sizeof(visit));
    memset(layer,-1,sizeof(layer));
    layer[s]=0;
    Q.push(s);
    visit[s]=true;
    while(!Q.empty())
    {
        p=Q.front();
        Q.pop();
        for(int i=1;i<=T;i++)
        {
            if(map[p][i]>0&&!visit[i])
            {
                layer[i]=layer[p]+1;
                visit[i]=true;
                if(i==t)return true;
                Q.push(i);
            }
        }
    }
    return false;
}
int Dinic(int s,int t)
{
    int Maxflow=0;
    while(bfs(s,t))
    {
        size=0;ans=0;
        dfs(s,t);
        Maxflow+=ans;
    }
    return Maxflow;
}
int main()
{
    //freopen("in.txt","r",stdin);
    while(cin>>P>>N)
    {
        memset(map,0,sizeof(map));
        input();
        build();
        coun=-1;
        cout<<Dinic(0,T)<<" ";
        cout<<coun+1<<endl;
        out();
    }
    return 0;
}



Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator