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

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
  • 評論內(nèi)容較長,點擊標題查看
  • --王私江
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            一本色道88久久加勒比精品 | 欧美日韩精品免费观看| 欧美 日韩 国产 一区| 一区二区三区黄色| 浪潮色综合久久天堂| 激情久久中文字幕| 欧美亚洲免费电影| 欧美中文在线观看| 亚洲国产高清aⅴ视频| 欧美精品一区视频| 美女精品网站| 99国内精品久久| 麻豆国产精品va在线观看不卡 | 久久综合九色欧美综合狠狠| 猫咪成人在线观看| 欧美视频在线一区| 国产日韩精品在线播放| 国语自产在线不卡| 99v久久综合狠狠综合久久| 亚洲欧美综合v| 亚洲第一精品夜夜躁人人爽| 91久久国产综合久久| 亚洲欧美日韩国产成人| 美女网站在线免费欧美精品| 欧美日韩中文在线观看| 伊人久久亚洲美女图片| 亚洲一区二区3| 欧美成人午夜激情在线| 亚洲在线第一页| 欧美精品一区二区三区四区| 国产欧美日韩综合| 一区二区欧美国产| 欧美 日韩 国产一区二区在线视频| 日韩一区二区精品葵司在线| 欧美一区免费视频| 欧美日韩综合精品| 最新国产の精品合集bt伙计| 欧美一区二区在线免费播放| 亚洲精品国产精品久久清纯直播| 小处雏高清一区二区三区| 欧美啪啪成人vr| 国语自产精品视频在线看8查询8| 亚洲手机视频| 亚洲欧洲一区二区三区在线观看| 久久精品亚洲| 国产精品欧美日韩一区| 亚洲精品综合精品自拍| 美日韩精品免费观看视频| 亚洲女性裸体视频| 欧美三级欧美一级| 日韩午夜在线视频| 免费看av成人| 久久久久成人网| 激情文学一区| 国产日韩成人精品| 麻豆精品在线视频| 国内成人在线| 欧美一区二区精品在线| 一区二区三区 在线观看视| 欧美不卡一区| 亚洲日本免费| 欧美国产日韩一区二区在线观看| 久久精品国产99精品国产亚洲性色| 国产精品视频你懂的| 亚洲天堂成人在线观看| 亚洲精品免费电影| 欧美日韩国产免费| 亚洲视频在线观看| 一本色道久久加勒比精品| 欧美日韩国产三级| 亚洲欧美综合国产精品一区| 亚洲一区二区视频在线观看| 国产美女扒开尿口久久久| 欧美一区二区视频97| 亚洲欧美一区二区在线观看| 国产午夜精品在线| 美国成人毛片| 欧美精品 日韩| 亚洲一区在线播放| 欧美一区二区精美| 亚洲国产视频a| 夜夜嗨av一区二区三区| 国产欧美日韩视频一区二区| 久热精品视频在线| 欧美精品18videos性欧美| 亚洲一区二区网站| 欧美综合国产精品久久丁香| 亚洲电影免费观看高清完整版在线观看 | 中文欧美在线视频| 国产欧美在线看| 欧美激情中文字幕一区二区| 欧美视频在线观看 亚洲欧| 亚洲欧美清纯在线制服| 久久久久久亚洲精品不卡4k岛国| 亚洲欧洲在线观看| 亚洲综合第一页| 亚洲经典自拍| 亚洲专区免费| 亚洲美女毛片| 久久九九精品99国产精品| 一区二区三区免费观看| 香蕉成人啪国产精品视频综合网| 亚洲黄色在线视频| 亚洲欧美在线一区| 亚洲美女色禁图| 久久久久久久久岛国免费| 亚洲免费一在线| 欧美成人一品| 久热国产精品| 国产亚洲美州欧州综合国| 国产精品黄页免费高清在线观看| 久久久久久色| 国产精品日本一区二区| 亚洲人成网站999久久久综合| 国产日产欧产精品推荐色| 99精品国产在热久久婷婷| 最新国产成人在线观看| 欧美一区国产二区| 亚洲男人天堂2024| 欧美日韩视频不卡| 亚洲国产日韩欧美在线99| 影音先锋日韩资源| 久久精品亚洲精品| 久久久国产亚洲精品| 国产精品成人免费视频| 亚洲精品免费一区二区三区| 亚洲电影第1页| 久久夜色撩人精品| 久久伊人一区二区| 国产一区二区欧美| 性欧美xxxx大乳国产app| 午夜精品一区二区三区在线视| 欧美人成在线视频| 亚洲精品乱码久久久久| 亚洲激情在线观看| 欧美精品大片| 亚洲理论在线| 亚洲一区二区三区三| 欧美日一区二区三区在线观看国产免| 欧美成人午夜视频| 亚洲精品国产品国语在线app| 蜜乳av另类精品一区二区| 免费人成网站在线观看欧美高清 | 国产视频一区在线| 欧美一区二区三区喷汁尤物| 欧美专区在线观看| 国内精品视频在线播放| 久久久久高清| 亚洲经典视频在线观看| 99视频一区二区| 欧美日韩精品一区二区天天拍小说| 91久久国产综合久久| 亚洲一区二区三区四区五区午夜| 国产精品久久久久久妇女6080 | 欧美大片免费观看在线观看网站推荐| 狠狠色丁香久久婷婷综合_中| 久久精品国产69国产精品亚洲| 韩国成人精品a∨在线观看| 久久―日本道色综合久久| 亚洲第一天堂av| 夜夜嗨一区二区| 国产嫩草影院久久久久 | 亚洲综合色丁香婷婷六月图片| 欧美中文字幕| 亚洲二区在线| 欧美日韩国产综合视频在线观看| 一区二区三区四区蜜桃| 久久久噜噜噜久久人人看| 亚洲日韩第九十九页| 国产精品久久久久久久久久免费| 午夜亚洲影视| 91久久精品日日躁夜夜躁国产| 欧美三级电影精品| 亚洲欧美中文日韩在线| 亚洲国产精品久久| 欧美一区二区三区免费观看| 在线欧美日韩精品| 国产精品成人v| 免费91麻豆精品国产自产在线观看| 99视频国产精品免费观看| 美国十次成人| 欧美一区二区三区免费观看视频| 亚洲黄色一区| 国内久久精品| 国产精品久久久久高潮| 欧美高清hd18日本| 久久精品国产久精国产爱| 一区二区三区免费在线观看| 欧美成年网站| 久久久水蜜桃| 午夜精品久久久久久久蜜桃app| 91久久精品国产91久久| 国产字幕视频一区二区| 国产精品久久久99| 欧美日韩一区二区视频在线| 欧美v国产在线一区二区三区| 性久久久久久久久| 亚洲一区二区高清| 一区二区三区四区五区视频| 亚洲成在人线av|