簡單的拆點
拆成入點和出點,對應點之間連一條cap=1,cost=x和一條cap=inf,cost=0的邊,然後相鄰點的出點和其他點的入點連邊,然後s有k的流量,然後跑最大費用最大流就好了
#include #include #include #include #include using namespace std;
struct edge;
const int maxn = 10000;
const int inf = 0x3f3f3f3f;
vectoredges;
vectorg[maxn];
void addedge(int u,int v,int cap,int cost));
edges.push_back((edge));
int cnt=edges.size();
g[u].push_back(cnt-2);
g[v].push_back(cnt-1);
}int d[maxn],a[maxn],p[maxn],vis[maxn],s,t;
queueq;
bool spfa(int &flow,int &cost)}}
}if(d[t]==inf)
return false;
flow+=a[t];
cost+=d[t]*a[t];
for(int i=t;i!=s;i=edges[p[i]].u)
return true;
}void mcmf(int &flow,int &cost)
int n,k;
inline int id(int x,int y)
int main()
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
addedge(s,id(1,1),k,0);
addedge(id(n,n)+n*n,t,inf,0);
int cost,flow;
mcmf(flow,cost);
printf("%d\n",-cost);
return 0;
}
P2045 方格取數加強版
給出乙個n n的矩陣,每一格有乙個非負整數aij,aij 1000 現在從 1,1 出發,可以往右或者往下走,最後到達 n,n 每達到一格,把該格仔的數取出來,該格仔的數就變成0,這樣一共走k次,現在要求k次所達到的方格的數的和最大 輸入格式 第一行兩個數n,k 1 n 50,0 k 10 接下來n...
洛谷P2045 方格取數加強版
傳送門 一看題意,發現第二次取就是0了,那麼就想到了網路流 其實是看標籤 費用流建圖 1.首先s向 1,1 連一條費用為0,容量k的邊 2.然後 n,n 向t連一條費用為0,容量k的邊 3.每個點 i,j 向 i 1,j 和 i,j 1 連一條費用0,容量k的邊 此處注意判邊界 4.每個點拆成入點和...
洛谷P2045 方格取數加強版
題目 link 網路流 費用流 一道比較好建模的題,重點是怎樣讓每個數隻被取一次 控制每個點被走的次數,我們可以很容易想到拆點 對於每個點,我們在入點和出點之間連兩條邊,一條流量為 1 11,費用為該格仔的權值 另一條流量為 infty 費用為 0 00。除此之外,每個點還要分別向右邊和下面的連邊,...