HDu 1498ハンガリーアルゴリズム
4394 ワード
http://acm.hdu.edu.cn/showproblem.php?pid=1498
このテーマは昨夜長い間やっていたが、テーマの意味が分からなかったので、ネット上のコードを見て、徹底的に理解した.実は学生一人一人が風船の1つを選んで踏むことができて、後ろにはたくさんの学生が並んでいます.何色の風船が何人の学生が踏んで、それぞれの色の風船がK回踏まれた後、どの色の風船が存在するかを聞いた.
最初にやったばかりなのに、繰り返してたくさん出力していることに気づきました.後で他の人がset容器を使ったのを見て、自分もついて使って、46 msを提出して、とても優れていると思って、神牛のコードを探して、1つの15 msのを発見して、汗.
実は人のアルゴリズムは私と同じで、ただ人は2つの配列で記録します に等しい 私のset容器.後でsetコンテナのようなシステムテンプレートを少なくしなければなりません.これは多かれ少なかれ私のプログラミング能力とコードの感度に影響を与えるからです.の
次は私のコード46 msです.
次は神牛コード15 msです.
実はまだ0 msの神牛がたくさん....
このテーマは昨夜長い間やっていたが、テーマの意味が分からなかったので、ネット上のコードを見て、徹底的に理解した.実は学生一人一人が風船の1つを選んで踏むことができて、後ろにはたくさんの学生が並んでいます.何色の風船が何人の学生が踏んで、それぞれの色の風船がK回踏まれた後、どの色の風船が存在するかを聞いた.
最初にやったばかりなのに、繰り返してたくさん出力していることに気づきました.後で他の人がset容器を使ったのを見て、自分もついて使って、46 msを提出して、とても優れていると思って、神牛のコードを探して、1つの15 msのを発見して、汗.
実は人のアルゴリズムは私と同じで、ただ人は2つの配列で記録します に等しい 私のset容器.後でsetコンテナのようなシステムテンプレートを少なくしなければなりません.これは多かれ少なかれ私のプログラミング能力とコードの感度に影響を与えるからです.の
次は私のコード46 msです.
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<set>
using namespace std;
#define maxn 105
#define mem(str,x) memset(str,(x),sizeof(str))
int map[maxn][maxn];
bool vis[maxn];
int flag[maxn][maxn];
int per[maxn];
int ans[maxn];
int n,k;
bool find(int x)
{
for(int i=1;i<=n;i++){
if( !vis[i] && flag[x][i] ){
vis[i] = true;
if(per[i] == -1 || find( per[i] ) ){
per[i] = x;
return true;
}
}
}
return false;
}
int hungry()
{
int sum=0;
for(int i=1;i<=n;i++) per[i] = -1;
for(int i=1;i<=n;i++){
mem(vis,false);
sum+=find(i);
}
return sum;
}
int main()
{
set< int > v;
while(scanf("%d%d",&n,&k)&&n!=0&&k!=0){
mem(map,0); v.clear(); mem(ans,0);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
int x;
scanf("%d",&x);
map[i][j] = x;
v.insert( map[i][j] );
}
}
if( k >= n ) printf("-1
");
else{
int anss=0;
set<int>::iterator it;///
for(it = v.begin(); it != v.end(); it++ ){
int color = *it;
mem(flag,0);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
if(map[i][j] == color)
flag[i][j] = 1;
else
flag[i][j] = 0;
}
int sum = hungry();
if(sum > k) ans[anss++] = color;
}
if(anss==0) printf("-1
");
else{
for(int i = 0;i <anss;i++ ){
printf("%d%c",ans[i],(i==anss-1)?'
':' ');
}
}
}
}
return 0;
}
次は神牛コード15 msです.
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
int map[101][101],mark[101];
int v[101],link[101];
int a[101],color[101];
int k,n;
int cmp(const void*a,const void*b)
{
return *(int*)a-*(int*)b;
}
int dfs(int i,int k)
{
int j;
for(j=1;j<=n;j++)
{
if(map[i][j]==k&&!v[j])
{
v[j]=1;
if(link[j]==0||dfs(link[j],k))
{
link[j]=i;
return 1;
}
}
}
return 0;
}
int main()
{
int i,j,t,tt,ans;
while(scanf("%d%d",&n,&k)!=-1)
{
if(n==0&&k==0)
break;
memset(color,0,sizeof(color));
memset(mark,0,sizeof(mark));
t=0;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
scanf("%d",&map[i][j]);
if(!mark[map[i][j]])
{
mark[map[i][j]]=1;
color[t++]=map[i][j];
}
}
}
tt=0;
for(i=0;i<t;i++)
{
ans=0;
memset(link,0,sizeof(link));
for(j=1;j<=n;j++)
{
memset(v,0,sizeof(v));
if(dfs(j,color[i]))
ans++;
}
if(ans>k)
a[tt++]=color[i];
}
if(tt==0)
printf("-1
");
else
{
qsort(a,tt,sizeof(a[0]),cmp);
for(i=0;i<tt-1;i++)
printf("%d ",a[i]);
printf("%d
",a[i]);
}
}
return 0;
}
実はまだ0 msの神牛がたくさん....