思路:這道題建圖比較難想,首先是建立超級源點和超級匯點,那麼由於有k個警察,於是vs與0連邊,容量為k,費用為0,因為這k個警察不一定都出去,也就是不一定是最大流,於是0和vt連邊,容量為k,費用為0。然後就是拆點建圖了:
(1):0到i連邊,容量為1,費用0到i的最短路,表示去抓城市i的小偷。
(2):從i到i+n,容量為1,費用為-1000000(很小的負權),這樣可以保證每個城市都能遍歷到。
(3):對於城市i,j,(i
1 #include2 #include3 #include4 #include5 #include6view codeusing
namespace
std;
7#define maxn 222
8#define maxm 4444444
9#define inf 1<<30
1011
struct
edgeedge[maxm];
1415
intvs,vt,ne,n,m,k;
16int
head[maxn];
1718
void insert(int u,int v,int cap,int
cost)
1932
33int
dist[maxn],pre[maxn],cur[maxn];
34bool
mark[maxn];
35bool spfa(int vs,int
vt)3656}
57}58}
59return dist[vt]
6162
int mincostflow(int vs,int
vt)63
70 flow+=aug,cost+=dist[vt]*aug;
71for(int u=vt;u!=vs;u=pre[u])75}
76return
cost;77}
7879
intmap[maxn][maxn];
80void
floyd()
8188
89int
main()
90104
floyd();
105 insert(vs,0,k,0
);106 insert(0,vt,k,0
);107
for(int i=1;i<=n;i++)
112for(int i=1;i<=n;i++)
116}
117 printf("
%d\n
",mincostflow(vs,vt)+1000000*n);
118}
119return0;
120 }
hdu 4411 最小費用流
思路 這道題建圖比較難想,首先是建立超級源點和超級匯點,那麼由於有k個警察,於是vs與0連邊,容量為k,費用為0,因為這k個警察不一定都出去,也就是不一定是最大流,於是0和vt連邊,容量為k,費用為0。然後就是拆點建圖了 1 0到i連邊,容量為1,費用0到i的最短路,表示去抓城市i的小偷。2 從i到...
最小費用流
include include define maxn 61 define maxv maxn maxn 2 1 define maxe maxv 5 define oo 2147483647 define min a,b a b b a define maxq maxe using namespa...
最小費用流
int v 頂點數 vector g max v int dist max v 最短距離 int prev max v 最短路中前驅結點對應的點 int pree max v 最短路中前驅結點對應的邊 void addedge int from,int to,int cap,int cost 求從s...