C 數字配對 (網路流 最大費用最大流)

2022-03-05 16:44:51 字數 2138 閱讀 8846

題目大意:中文題目

具體思路:用網路流的思想,我們求得是最大的匹配數,那麼我們按照二分圖的形式去建邊就可以了,加上超級源點和超級匯點,就可以用網路流跑了。

建邊的時候,我們首先把每個數進行素因子分解,看一下當前的這個數能夠被分解成多少個素數,奇數個的放在乙個陣列裡,偶數個的放在另乙個陣列裡面(如果兩個點直接能匹配的話,就需要他們兩個相除之後只能剩餘乙個素數)。對於當前的這條邊的權值,我們是按照最大流進行的,所以需要建立負邊,具體的注釋在**中解釋吧。

ac**:

1 #include 2 #include3 #include4 #include5 #include6 #include7 #include8

using

namespace

std;

9 # define ll long

long

10const

int maxn = 200+100;11

const

int maxm = 3e5+20050;12

const

int mod = 1e9+7;13

const ll inf =1000000000000000ll;

14struct

node

15 edge[maxm];

21ll dis[maxm],prev[maxm],pree[maxm];

22int

vis[maxm];

23int

head[maxm],num;

24ll t1[maxm],t2[maxm],t3[maxm];

25ll tx[maxm],ty[maxm];

26int viss[maxm],prim[maxm],primnum,isprim[maxm*100

];27

void

prime()

2840}41

}42}43

bool

judge(ll t1,ll t2)

4459

return1;

60}61void addedge(int fr,int

to,ll w,ll cost)

6274

bool spfa(int st,int

ed)75

101}

102}

103}

104return pree[ed]!=-1

;105

}106 ll mincostflow(int st,int

ed)107

117if(cost+minn*dis[ed]<=0

)//注意這個地方,我們建立的是負邊。

118126

}127

else //尋找臨界點

128132

}133

return

ans;

134}

135int

main()

136146

for(int i=1; i<=n; i++)

147150

for(int i=1; i<=n; i++)

151154

int num1=0,num2=0

;155

for(int i=1; i<=n; i++)//預先處理

156165

if(tmp==1||tmp==0

)166

break

;167

}168

if(tt&1

)169 tx[++num1]=i;

170else

171 ty[++num2]=i;

172}

173for(int i=1; i<=num1; i++)

174181

}182

}183

for(int i=1; i<=num1; i++)

184187

for(int i=1; i<=num2; i++)

188191 ll ans=mincostflow(0,n+1

);192 printf("

%lld\n

",ans);

193return0;

194 }

網路流 最小費用最大流

q 為什麼突然想搞網路流?a 迫於tham 蛤mu的淫威 用最短路演算法求出s t的路徑 把路徑要摳出來,而且每條邊要有容量 算一下路徑裡面的可以流過的最大的流量 發現此時的花費就是 dis t flow 累加即可.重複1 3直到不能夠到達t.include include include incl...

網路流 費用流 最大流最小割定理

囧,今天第一天電腦競賽補課,就把最大流的bfs增廣 先流預推法 最大流最小割定理 最小費用流講完了。汗。而我,就只記住了bfs增廣和最大流最小割定理。最小費用流ms差不多明白了。所以先講講bfs增廣求最大流的演算法吧。簡單的來說,就是從s 源 開始bfs,直到到達t 匯 or不存在增廣路。所謂增廣路...

網路流 費用流 最大流最小割定理

囧,今天第一天電腦競賽補課,就把最大流的bfs增廣 先流預推法 最大流最小割定理 最小費用流講完了。汗。而我,就只記住了bfs增廣和最大流最小割定理。最小費用流ms差不多明白了。所以先講講bfs增廣求最大流的演算法吧。簡單的來說,就是從s 源 開始bfs,直到到達t 匯 or不存在增廣路。所謂增廣路...