給出乙個 n 個點的有向圖,找若干個圈,是的每個結點恰好屬於乙個圈。要求總長度盡量小。
三倍經驗題 uva 12264,hdu 1853
這題有兩種解法,一是匹配:
每個點只在乙個圈中,則他有唯一的前驅和後繼,也就是入度為1,出度為1,拆成 入度點和出度點,跑最小全匹配,因為是匹配,這樣就保證了他在唯一的乙個圈中,但是劉汝佳的板子有個問題,就是他會產生被迫的匹配,瞎起的名字,注意有這樣的原本不存在的邊,就說明無解。再次熟悉一下頂標。太久沒寫了~~~~
而是費用流:mcmf
就是中間cap = c,有無解就是看流量是否為 n ,是的,就是最小費用。
#include usingnamespace
std;
const
int maxn = 100
;const
int inf = 1
<<30
;int
w[maxn][maxn],n;
int lx[maxn],ly[maxn]; ///
頂標int lefts[maxn]; ///
left[i] 為右邊第 i 個點的標號
bool s[maxn],t[maxn]; ///
s,t左右第 i 個點是否標記
bool match(int
i) }
return
false;}
void
update()
}void
km()
for(int i=1;i<=n;i++)
}}int
main()
}km();
bool flag = true
;
int ans = 0
;
for(int j = 1; j <= n; j++)
ans+= -w[i][j];
}if(flag==false) puts("n"
);
else printf("
%d\n
",ans);
}return0;
}