社区讨论
用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 条回复,欢迎继续交流。
正在加载回复...