題目大意:中文題目
具體思路:用網路流的思想,我們求得是最大的匹配數,那麼我們按照二分圖的形式去建邊就可以了,加上超級源點和超級匯點,就可以用網路流跑了。
建邊的時候,我們首先把每個數進行素因子分解,看一下當前的這個數能夠被分解成多少個素數,奇數個的放在乙個陣列裡,偶數個的放在另乙個陣列裡面(如果兩個點直接能匹配的話,就需要他們兩個相除之後只能剩餘乙個素數)。對於當前的這條邊的權值,我們是按照最大流進行的,所以需要建立負邊,具體的注釋在**中解釋吧。
ac**:
1 #include 2 #include3 #include4 #include5 #include6 #include7 #include8using
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不存在增廣路。所謂增廣路...