ハンガリー&離散(ボード)

これは、もともと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)

公開された30元の記事 ウォンの賞賛9 ビュー1290

おすすめ

転載: blog.csdn.net/Zhang_sir00/article/details/104470401