社区讨论

用STL比没用STL慢?!

P3381【模板】最小费用最大流参与者 7已保存回复 14

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
14 条
当前快照
1 份
快照标识符
@mi6gxb89
此快照首次捕获于
2025/11/20 04:41
4 个月前
此快照最后确认于
2025/11/20 05:08
4 个月前
查看原帖
没用vector的:
CPP
#include<cstdio>
#include<cstring>
#include<queue>
#define N 5010
#define M 50010
using namespace std;
int n,m,S,T,mflow,mcost;
int head[N],nxt[M<<1],to[M<<1],cost[M<<1],cap[M<<1],cnt=-1;
int dis[N],from[N],pos[N]; bool used[N];
void test_e()
{
    for(int i=1;i<=n;i++)
    {
        printf("%d:\n",i);
        for(int j=head[i];j!=-1;j=nxt[j])
            printf("{%d %d %d}\n",to[j],cap[j],cost[j]);
    }
}
inline void adde(int x,int y,int ca,int co)
{
    to[++cnt]=y; cost[cnt]= co; cap[cnt]=ca; nxt[cnt]=head[x]; head[x]=cnt;
    to[++cnt]=x; cost[cnt]=-co; cap[cnt]= 0; nxt[cnt]=head[y]; head[y]=cnt;
}
bool SPFA()
{
    memset(dis,63,sizeof(dis));
    queue<int> que;
    que.push(S); dis[S]=0; used[S]=1;
    while(!que.empty())
    {
        int p=que.front(); que.pop();
        for(int i=head[p]; i!=-1 ; i=nxt[i])
            if(cap[i]>0 && dis[to[i]]>dis[p]+cost[i])
            {
                dis[to[i]]=dis[p]+cost[i];
                from[to[i]]=p; pos[to[i]]=i;
                if(!used[to[i]])
                {
                    que.push(to[i]); used[to[i]]=1;
                }
            }
        used[p]=0;
    }
    if(dis[T]==dis[0]) return false;
    return true;
}
int main()
{
    memset(head,-1,sizeof(head));
    int i,x,y,ca,co;
    scanf("%d %d %d %d",&n,&m,&S,&T);
    for(i=1;i<=m;i++){scanf("%d %d %d %d",&x,&y,&ca,&co); adde(x,y,ca,co);}
    while(SPFA())
    {
        int flow=1e9;
        for(i=T;i!=S;i=from[i])  flow=min(flow,cap[pos[i]]);
        //test_e();
        mflow+=flow; mcost+=flow*dis[T];
        for(i=T;i!=S;i=from[i]) {cap[pos[i]]-=flow; cap[pos[i]^1]+=flow;}
        //test_e();
    }
    printf("%d %d\n",mflow,mcost);
    return 0;
}
用vector的:
CPP
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#define INF 2139062143
using namespace std;
struct P
{
    int from,to,cap,c;
};
vector<P> edge;
vector<int> map[10010]; 
queue<int> que;
bool used[10010];
int dis[10010],path[10010];
int n,m,s,t,mflow,mcost;
void adde(int x,int y,int cap,int c)
{
    P tmp;
    tmp.from=x,tmp.to=y,tmp.cap=cap,tmp.c=c ; edge.push_back(tmp);
    tmp.from=y,tmp.to=x,tmp.cap=0  ,tmp.c=-c; edge.push_back(tmp);
    int l=edge.size();
    map[x].push_back(l-2);
    map[y].push_back(l-1);
}
bool SPFA()
{
    memset(dis,127,sizeof(dis));
    dis[s]=0,que.push(s),used[s]=1;
    while(!que.empty())
    {
        int p=que.front(); que.pop();
        int l=map[p].size();
        for(int i=0;i<l;i++)
        {
            P e=edge[map[p][i]];
            if(e.cap>0 && dis[e.to]>dis[p]+e.c)
            {
                dis[e.to]=dis[p]+e.c;
                path[e.to]=map[p][i];
                if(!used[e.to])
                {
                    que.push(e.to);
                    used[e.to]=1;
                }
            }
        }
        used[p]=0;
    }
    if(dis[t]==dis[0]) return false;
    return true;
}
int main()
{
    int i,j,x,y,cap,c;
    scanf("%d %d %d %d",&n,&m,&s,&t);
    for(i=1;i<=m;i++)
    {
        scanf("%d %d %d %d",&x,&y,&cap,&c);
        adde(x,y,cap,c);
    }
    while(SPFA())
    {
        int flow=INF;
        for(i=t;i!=s;i=edge[path[i]].from)
            flow=min(flow ,edge[path[i]].cap);
        mflow+=flow,mcost+=dis[t]*flow;
        for(i=t;i!=s;i=edge[path[i]].from)
            edge[path[i]].cap-=flow,edge[path[i]^1].cap+=flow;
    }
    printf("%d %d",mflow,mcost);
    return 0;
}

回复

14 条回复,欢迎继续交流。

正在加载回复...