これは、もともとGYM-102458Aの例で行うことを意図していたが、タイトルのこの缶(GAI)愛(SI)はとても実にある。
我々は使用POJ-3041の薄汚い例を行うので、(この問題は個別の必要はありませんが)
POJ-3041とGYM-102458Aは、これは魔法のグラフ理論である(図実行ハンガリーの両面として横軸と縦軸のようにする必要がある、2つの無関係な問題は、組成物を意図しましたこの方法では)同じことがありません
それをここに貼り付ける前に、私の心は、泥だらけの、忘れてしまった...)作らないように(2つの棒グラフの本質を思い出す
最小頂点カバー=最大マッチングの
最大の一致-最小のパスカバレッジ=ポイントの数を
最大の独立集合=ポイント-最大一致
GYM-102458Aを求めている、ここで最大のマッチング
POJ-3041をカバーするために計算され、最小のポイントである
、それは細部に行かない、非常に精通しているとして、以下のハンガリーのボードを、問題があると、その後のような以前のノートを見て、実際に(、私はあまりにも怠惰)だから
ハンガリーボード:
bool dfs(int now)
{
for (int i = head[now]; i != -1; i = edge[i].nxt)
{
int v = edge[i].to;
if (!vis[v])
{
vis[v] = 1;
if (link[v] == -1 || dfs(link[v]))
{
link[v]=now;
return 1;
}
}
}
return 0;
}
void getans()
{
int ans = 0;
for (int i = 1; i <= mx; i++)
{
memset(vis, 0, sizeof(vis));
if (dfs(i))ans++;
}
cout << ans;
}
将来のためのいくつかは、それを行うのセーブ以下のハイライトは気にしなかった、常にそのシンプルさを感じに使用し、個別のボードをまとめ、書き込みの結果自体は、常にトラブルのすべての種類が...最終的には、総括する必要性を感じて...
方法1:繰り返し要素を含む、同一の要素には同一の離散化を有します
int n;
int s[Max_n],t[Max_n];
for(int i=1;i<=n;i++){
scanf("%d",&s[i]);
t[i]=s[i];
}
sort(t+1,t+n+1);
int m=unique(t+1,t+n+1)-t-1; //m为不重复元素的个数
for(int i=1;i<=n;i++){
s[i]=lower_bound(t+1,t+m+1,s[i])-t;
}
方法2:反復要素かどうかにかかわらず、離散した要素は変わります。
int n;
struct node{
int x,id;
operator<(const node& no)const{
if(x!=no.x)
return x<no.x;
else
return id<no.id;
}
}no[Max_n];
int s[Max_n];
for(int i=1;i<=n;i++){
scanf("%d",&no[i].x);
no[i].id=i;
}
sort(no+1,no+n+1);
for(int i=1;i<=n;i++)s[no[i].id]=i;
うーん...風のコードのようなオリジナルのブロガー私は、友人を借ります
GYM-102458Aの神の最後にTucao波(SHA)奇数(QUE)