青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

2012sdACM省賽 題目H

http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2414


An interesting game

Time Limit: 2000MS Memory limit: 65536K

題目描述

Xiao Ming recently designs a little game, in front of player there are N small hillsides put in order, now Xiao Ming wants to increase some hillsides to block the player, so he prepared another M hillsides, but he does not hope it will be too difficult,so only K in M hillsides are selected to add at most. Paying attention to the original N hillsides, between each two can add only one hillside. Xiao Ming expects players from the starting place to reach the destination in turn and passes all the hillsides to make his distance travelled longest. Please help Xiao Ming how to add the hillsides that he prepared. Note: The distance between two hillsides is the absolute value of their height difference.

輸入

The first line of input is T, (1 <= T <= 100) the number of test cases. Each test case starts with three integers N,M,K (2 <= N <= 1000, 1 <= M <= 1000, 1 <= K <= M and 1 <= K < N), which means that the number of original hillsides, the number of hillsides Xiao Ming prepared and The number of most Xiao Ming can choose from he prepared. Then follow two lines, the first line contains N integers Xi (0 <= Xi <= 30), denoting the height of each original hillside, Note: The first integer is player's starting place and the last integer is player's destination. The second line contains M integers Yi (0 <= Yi <= 30), denoting the height of prepared each hillsides.

輸出

For every test case, you should output "Case k: " first in a single line, where k indicates the case number and starts from 1. Then print the distance player can travel longest.

示例輸入

3 2 1 1 6 9 8 2 1 1 6 9 15 3 2 1 5 9 15 21 22 

示例輸出

Case 1: 3 Case 2: 15 Case 3: 36 

提示

 

來源

 2012年"浪潮杯"山東省第三屆ACM大學生程序設計競賽

示例程序


比賽的時候沒有往圖這方面考慮

比賽結束后發(fā)現(xiàn)是匹配問題,然后就從這開始,一直悲劇了

這個題目我寫了兩種解法

1,構造二分圖,求二分圖的最大權匹配,然后貪掉小的邊,復雜度 (n^3)超時
2,最大費用可行流,加一條限制邊,變?yōu)樽钚≠M用流問題

兩個模型不寫了,這幾天搞這個題無力了
貼下代碼,小小的參考了下段神的代碼,
本來寫的是鄰接矩陣的,結果無奈到死,一直改不出來,我想是不是那個沒法處理負權邊呢?我也不知道 是不是
然后就改成了鄰接表的
代碼1 KM
#include<stdio.h>
#include
<string.h>
#include
<math.h>
#include
<algorithm>
#define pp printf("here\n")
#define maxn 1005
#define inf 0xfffffff
using namespace std;
int map[maxn][maxn],w[maxn][maxn],f[maxn],a[maxn];
int b[maxn],x[maxn],y[maxn],pre[maxn];
bool visx[maxn],visy[maxn];
int n,m,k,num;
int ans,slack;
int count1=0;
int lx[maxn],ly[maxn];
int maty[maxn],matx[maxn];
int fx[maxn],fy[maxn];
int nx,ny;
struct node
{
    
int u,val;
} edge[maxn];
int abs1(int x)
{
    
if(x<0return -x;
    
else return x;
}
int cmp(node t1,node t2)
{
    
return t1.val<t2.val;
}
int path(int u)
{
    fx[u] 
= 1;
    
for (int v = 1; v <= ny; v++)
        
if (lx[u] + ly[v] == w[u][v] && fy[v] < 0)
        {
            fy[v] 
= 1;
            
if (maty[v] < 0 || path(maty[v]))
            {
                matx[u] 
= v;
                maty[v] 
= u;
                
return 1;
            }
        }
    
return 0;
}
int km()
{
    
int i,j,k,ret = 0;
    memset(ly, 
0sizeof(ly));
    
for (i = 1; i <= nx; i++)
    {
        lx[i] 
= -inf;
        
for (j = 1; j <= ny; j++)
            
if (w[i][j] > lx[i]) lx[i] = w[i][j];
    }
    memset(matx, 
-1sizeof(matx));
    memset(maty, 
-1sizeof(maty));
    
for (i = 1; i <= nx; i++)
    {
        memset(fx, 
-1sizeof(fx));
        memset(fy, 
-1sizeof(fy));
        
if (!path(i))
        {
            i
--;
            
int p = inf;
            
for (k = 1; k <= nx; k++)
            {
                
if (fx[k] > 0)
                    
for (j = 1; j <= ny; j++)
                        
if (fy[j] < 0 && lx[k] + ly[j] - w[k][j] < p)
                            p
=lx[k]+ly[j]-w[k][j];
            }
            
for (j = 1; j <= ny; j++)
                ly[j] 
+= fy[j]<0 ? 0 : p;
            
for (j = 1; j <= nx; j++)
                lx[j] 
-= fx[j]<0 ? 0 : p;
        }
    }
}
void work()
{
    
int i,j;
    num
=0;
    
for(i=1; i<=m; i++)
    {
        edge[num].u
=pre[i];
        edge[num].val
=map[maty[i]][i];
        ans
+=edge[num].val;
        num
++;
    }
    sort(edge,edge
+num,cmp);
    
//for(i=0;i<num;i++)
        
//printf("%d ",edge[i].val);printf("\n");
    
//for(i=0;i<num;i++) printf("%d  %d\n",edge[i].u,edge[i].val);
    for(i=0; i<m-k; i++)
        ans
=ans-edge[i].val;
}
int main()
{
    
int times,t,i,j,w;
    scanf(
"%d",&t);
    
for(times=1; times<=t; times++)
    {
        scanf(
"%d%d%d",&n,&m,&k);
        memset(a,
0,sizeof(a));
        memset(map,
0,sizeof(map));
        memset(f,
0,sizeof(f));
        ans
=0;
        
for(i=1; i<=n; i++)
        {
            scanf(
"%d",&a[i]);
            
if(i!=1)
            {
                f[i
-1]=abs1(a[i]-a[i-1]);
                ans
+=f[i-1];
            }
        }
        
for(i=1; i<=m; i++) scanf("%d",&b[i]);
        
//printf("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n");
        for(i=1; i<=n-1; i++)
            
for(j=1; j<=m; j++)
            {
                w
=abs1(a[i]-b[j])+abs1(a[i+1]-b[j])-f[i];
                map[i][j]
=w;
                
//printf("%d %d %d\n",i,j,w);
            }
        
//printf("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n");
        nx=n-1;
        ny
=m;
        km();
        work();
        printf(
"Case %d: %d\n",times,ans);
    }
    
return 0;
}

2 最小費用流,(最小費用路的做法,spfa+mincost)
#include<cstdio>
#include
<cstring>
#define maxn 1500
#define maxm 150000
#define inf 0x7fffffff
int h[maxn],a[50],f[maxn];
int n,m,k,s,t;
int sum,ans,nn;
bool vis[maxn];
bool mmm;
int pre[maxn];
struct node 
{
    
int v,next,cap,cost;
}edge[maxm
+1];
int head[maxn],num;
void add(int u,int v,int cap,int cost)
{
    edge[num].v
=v;
    edge[num].cap
=cap;
    edge[num].cost
=cost;
    edge[num].next
=head[u];
    head[u]
=num++;
    edge[num].v
=u;
    edge[num].cap
=0;
    edge[num].cost
=-cost;
    edge[num].next
=head[v];
    head[v]
=num++;
}
int abs(int x)
{
    
if(x<0return -x;
    
return x;
}
int min(int a,int b)
{
    
return a<b?a:b;
}
bool spfa()
{
    
int q[maxm+1],head1,tail,dist[maxn],i;
    memset(dist,
0x6f,sizeof(dist));
    memset(vis,
0,sizeof(vis));
    head1
=0;tail=1;
    q[tail]
=s;
    vis[s]
=1;
    dist[s]
=0;
    
while(head1!=tail)
    {
        head1
=head1%maxm+1;
        
int u=q[head1];
        
for(i=head[u];i!=-1;i=edge[i].next)
        {
            
int v=edge[i].v;
            
if(dist[v]>dist[u]+edge[i].cost&&edge[i].cap>0)
            {
                dist[v]
=dist[u]+edge[i].cost;
                pre[v]
=i;
                
if(!vis[v])
                {
                    tail
=tail%maxm+1;
                    q[tail]
=v;
                    vis[v]
=1;
                }
            }
        }
        vis[u]
=1;
    }
    
if(dist[t]<0return true;
    
else return false;
}
void mincost()
{
    
int i;
    i
=t;
    
while(i!=s)
    {
        ans
+=edge[pre[i]].cost;
        edge[pre[i]].cap
--;
        
if(edge[pre[i]].cap==0) mmm=true;
        edge[pre[i]
^1].cap++;
        
if(edge[pre[i]^1].cap==1) mmm=true;
        i
=edge[pre[i]^1].v;
    }
}
void work()
{
    ans
=0;
    mmm
=true;
    
while(!mmm||spfa())
    {
        mmm
=false;
        mincost();
    }
    sum
=sum-ans;
}
int main()
{
    
int times,i,j,t1,x;
    scanf(
"%d",&t1);
    
for(times=1; times<=t1; times++)
    {
        scanf(
"%d%d%d",&n,&m,&k);
        sum
=0;
        
for(i=1; i<=n; i++)
        {
            scanf(
"%d",&h[i]);
            
if(i!=1)
            {
                f[i
-1]=abs(h[i]-h[i-1]);
                sum
=sum+f[i-1];
            }
        }
        memset(a,
0,sizeof(a));
        
for(i=1; i<=m; i++)
        {
            scanf(
"%d",&x);
            a[x]
++;
        }
        s
=0;
        nn
=33+n;
        
//源匯2個,k限制1個,附加節(jié)點31(0-30),兩相鄰h的合并頂點n-1 總共33+n個節(jié)點
        t=32+n;
        
//////構圖
        num=0;
        memset(head,
-1,sizeof(head));
        add(
0,1,k,0);
        
for(i=0; i<=30; i++)
        {
            add(
1,i+2,a[i],0);
        }
        
for(i=0; i<=30; i++)
            
if(a[i]!=0)
                
for(j=1; j<=n-1; j++)
                    
if(f[j]<(abs(h[j]-i)+abs(h[j+1]-i)))
                    {
                        
int ww=f[j]-(abs(h[j]-i)+abs(h[j+1]-i));//設為負權,求最小費用流
                        add(i+2,j+32,1,ww);
                    }
        
for(i=1; i<=n-1; i++)
        {
            add(i
+32,t,1,0);
        }
        work();
        printf(
"Case %d: %d\n",times,sum);
    }
    
return 0;
}

posted on 2012-05-17 17:16 jh818012 閱讀(185) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

導航

統(tǒng)計

常用鏈接

留言簿

文章檔案(85)

搜索

最新評論

  • 1.?re: poj1426
  • 我嚓,,輝哥,,居然搜到你的題解了
  • --season
  • 2.?re: poj3083
  • @王私江
    (8+i)&3 相當于是 取余3的意思 因為 3 的 二進制是 000011 和(8+i)
  • --游客
  • 3.?re: poj3414[未登錄]
  • @王私江
    0ms
  • --jh818012
  • 4.?re: poj3414
  • 200+行,跑了多少ms呢?我的130+行哦,你菜啦,哈哈。
  • --王私江
  • 5.?re: poj1426
  • 評論內容較長,點擊標題查看
  • --王私江
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美在线播放高清精品| 亚洲国产成人av| 亚洲久色影视| 亚洲欧洲在线看| 欧美国产成人在线| 亚洲午夜精品久久久久久浪潮 | 久久精品99国产精品| 伊人久久亚洲美女图片| 欧美大片在线观看一区| 欧美香蕉大胸在线视频观看| 久久精品免费电影| 女生裸体视频一区二区三区| 一区二区日韩欧美| 久久成人这里只有精品| 亚洲精品在线一区二区| 亚洲网站视频福利| 欧美激情1区2区3区| 亚洲一区二区三区视频播放| 亚洲国产天堂久久国产91| 国产精品免费观看在线| 久久精品国内一区二区三区| 欧美成人有码| 欧美亚洲综合在线| 欧美成人一区二区三区在线观看| 一本色道久久| 欧美一区深夜视频| 亚洲天堂视频在线观看| 久久久国产精品亚洲一区| 亚洲欧美日韩精品久久| 亚洲欧洲偷拍精品| 国产婷婷成人久久av免费高清| 亚洲第一久久影院| 久久香蕉精品| 午夜精品免费视频| 免费视频一区| 亚洲国产欧美日韩精品| 欧美怡红院视频一区二区三区| 国产日韩亚洲欧美| 亚洲精品1区2区| 国产一区亚洲| 欧美亚洲视频在线看网址| 一区二区电影免费在线观看| 久久精品综合一区| 午夜在线观看欧美| 国产精品美女久久福利网站| 亚洲国产一二三| 国产精品综合久久久| 一本色道久久加勒比精品| 欧美日韩亚洲一区二| 日韩视频精品在线观看| 蜜臀久久久99精品久久久久久 | 久久精品亚洲国产奇米99| 欧美在线关看| 一区在线观看| 日韩系列欧美系列| 亚洲人成网站在线播| 欧美风情在线观看| 久久一二三四| 在线一区欧美| 亚洲美女av网站| 1204国产成人精品视频| 狠色狠色综合久久| 久久久国产成人精品| 亚洲激情欧美| 亚洲夜间福利| 国产精品美女视频网站| 日韩视频在线观看国产| 亚洲国产午夜| 欧美亚男人的天堂| 久久久欧美一区二区| 狼人社综合社区| 在线观看成人av| 欧美日韩国产二区| 亚洲国产成人久久| 鲁大师成人一区二区三区| 午夜日韩在线| 久久久久国产一区二区三区| 亚洲一区在线观看视频| 午夜久久黄色| 久久综合久久久| 女人色偷偷aa久久天堂| 欧美精品一区二区视频| 亚洲电影网站| 亚洲美女中文字幕| 国产精品夜夜嗨| 欧美中文在线观看| 国产一区二区成人久久免费影院| 美女脱光内衣内裤视频久久影院 | 久久国产福利| 亚洲图片欧美一区| 久久青草久久| 狼人天天伊人久久| 午夜免费在线观看精品视频| 国产精品theporn| 国内精品伊人久久久久av影院| 销魂美女一区二区三区视频在线| 精品av久久707| 99精品99| 亚洲欧洲一区二区在线观看| 欧美激情一区二区三区在线视频观看 | 亚洲欧美日韩国产综合精品二区| 欧美日一区二区三区在线观看国产免 | 亚洲主播在线播放| 麻豆精品国产91久久久久久| 亚洲国产天堂久久综合网| 亚洲丰满少妇videoshd| 国产一区二区三区高清播放| 日韩视频在线免费| 中文在线资源观看网站视频免费不卡| 国产精品v欧美精品∨日韩| 黑人巨大精品欧美一区二区| 亚洲精品国精品久久99热| 狠狠干成人综合网| 亚洲欧美日韩精品久久久| 亚洲免费av电影| 免费观看一区| 亚洲一级在线观看| 欧美午夜一区二区福利视频| 亚洲欧美卡通另类91av| 亚洲欧美在线磁力| 午夜一级在线看亚洲| 黄色成人91| 国产区二精品视| 亚洲一区在线免费| 日韩网站在线看片你懂的| 国产精品综合久久久| 99视频一区| 一区二区三区欧美在线观看| 蜜臀av性久久久久蜜臀aⅴ| 欧美一区二区| 国产精品jizz在线观看美国| 亚洲第一福利在线观看| 亚洲国产精品久久久| 欧美综合77777色婷婷| 欧美一区二区三区四区高清| 欧美日本在线视频| 久久影视精品| 国产日韩欧美二区| 欧美黄网免费在线观看| 久久久久久穴| 欧美精品一区二区高清在线观看| 韩国一区二区三区美女美女秀| 在线一区免费观看| 性欧美大战久久久久久久免费观看| 好男人免费精品视频| 99精品欧美一区二区三区 | 亚洲精品黄色| 亚洲国产精品久久久久婷婷884| 欧美亚洲一区二区在线| 国产视频在线观看一区二区三区| 久久久青草青青国产亚洲免观| 免费一区二区三区| 香蕉成人伊视频在线观看| 欧美国产高清| 欧美国产三区| 一区二区三区久久网| 欧美视频精品一区| 国产精品99久久久久久有的能看| 在线性视频日韩欧美| 欧美偷拍另类| 欧美一区二区三区精品电影| 久久五月天婷婷| 日韩视频一区| 国产精品综合av一区二区国产馆| 噜噜噜在线观看免费视频日韩| 蜜桃久久av一区| 亚洲午夜性刺激影院| 亚洲小少妇裸体bbw| 亚洲国产二区| 欧美影院在线播放| 在线看片成人| 国产精品免费观看在线| 欧美日韩亚洲综合| 久热精品在线视频| 午夜精品国产更新| 91久久国产综合久久| 亚洲高清久久久| 久久人人97超碰国产公开结果| 亚洲免费激情| 亚洲欧美国产日韩天堂区| 一区二区三区视频在线观看| 欧美国内亚洲| 欧美jjzz| 欧美成人精品在线观看| 欧美一区二区三区四区在线观看地址 | 在线一区二区日韩| 欧美刺激性大交免费视频| 久久久青草青青国产亚洲免观| 亚洲欧洲精品一区二区三区不卡 | 亚洲欧美日韩精品久久久久| 欧美一区二区三区免费大片| 亚洲欧美日韩精品| 欧美一区二区视频网站| 中文无字幕一区二区三区| 亚洲图片欧洲图片av| 亚洲一区自拍| 亚洲一二三区精品| 亚洲小说欧美另类社区| 午夜精品久久一牛影视| 欧美一区亚洲一区|