关于这个最大费用最大流的问题

P1559 运动员最佳匹配问题

有正环才求不出最长路啊...还有最长路也是可以求的 是不是写萎了
by Mr_Spade @ 2018-11-06 09:11:07


@[黎曦の夜](/space/show?uid=76208) 可以的啊 ```cpp #include<cstdio> #include<algorithm> #include<cstring> #include<queue> #define rei register int using namespace std; const int MAXN = 105, MAXM = 1005<<1; const int INF = 1e9; int n, s, t; int P[MAXN][MAXN], Q[MAXN][MAXN]; int max_cost; struct Edge { int next; int u, v; int data, cost; }edge[MAXM]; int num_edge = 1; int head[MAXN]; inline void make_edge(int u, int v, int data, int cost) { edge[++num_edge].next = head[u]; edge[num_edge].u = u; edge[num_edge].v = v; edge[num_edge].data = data; edge[num_edge].cost = cost; head[u] = num_edge; return ; } int dis[MAXN]; queue<int> q; bool vis[MAXN]; int pre[MAXN]; bool SPFA() { fill(dis,dis+MAXN,-INF); memset(vis,0,sizeof(vis) ); memset(pre,0,sizeof(pre) ); q.push(s), dis[s] = 0, vis[s] = 1; while(!q.empty() ) { int u = q.front(); q.pop(); for(rei i=head[u];i>1;i=edge[i].next) { int v = edge[i].v; if( edge[i].data && dis[u]+edge[i].cost>dis[v] ) { dis[v] = dis[u] +edge[i].cost; pre[v] = i; if(!vis[v]) q.push(v), vis[v] = 1; } } vis[u] = 0; } return dis[t]!=-INF; } void cost_flow() { int minn = INF; while( SPFA() ) { minn = INF; for(rei i=pre[t];i>1;i=pre[ edge[i].u ]) minn = min(minn,edge[i].data); for(rei i=pre[t];i>1;i=pre[ edge[i].u ]) { max_cost += minn*edge[i].cost; edge[i].data -= minn; edge[i^1].data += minn; } } return ; } int main() { scanf("%d",&n); s = 1, t = 2*n+2; for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) scanf("%d",&P[i][j]); for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) scanf("%d",&Q[i][j]); for(int i=1;i<=n;++i) { make_edge(s,i+1,1,0), make_edge(i+1,s,0,0); for(int j=1;j<=n;++j) { make_edge(i+1,j+1+n,1,P[i][j]*Q[j][i]), make_edge(j+1+n,i+1,0,-P[i][j]*Q[j][i]); } make_edge(i+1+n,t,1,0), make_edge(t,i+1+n,0,0); } cost_flow(); printf("%d",max_cost); return 0; } ```
by Md_Drew @ 2019-07-31 22:11:37


我也30分,不知道为什么
by 1261687299kid @ 2019-08-14 10:39:24


|