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

oyjpArt ACM/ICPC算法程序設計空間

// I am new in programming, welcome to my blog
I am oyjpart(alpc12, 四城)
posts - 224, comments - 694, trackbacks - 0, articles - 6

基本參數(shù)搜索

Posted on 2008-06-03 15:45 oyjpart 閱讀(3159) 評論(14)  編輯 收藏 引用 所屬分類: ACM/ICPC或其他比賽

上次百度之星第三題竟然不會做,很是慚愧啊,腦袋生銹了。

后來從HUST上面找了道類似的題目,AC了。


The perfect hamilton path

Time Limit: 5 Sec  Memory Limit: 128 MB
Submissions: 72  Solved: 16

Description

There are N(2 <= N <= 13) cities and M bidirectional roads among the cities. There exist at most one road between any pair of the cities. Along every road, there are G pretty girls and B pretty boys(1 <= G,B <= 1000).
You want to visit every city exactly once, and you can start from any city you want to. The degree of satisfaction is the ratio of the number of the pretty girls to the number of the pretty boys. You want to know the highest degree of satisfation.

Input

There are multiply test cases.
First line: two integers N, M;
The following M lines: every line with four integers i, j, G, B, response that there is a road between i and j with G and B.

Output

The highest degree of the satisfation, rounded to the third place after the decimal point.

Sample Input

3 3
1 2 5 3
2 3 7 4
3 1 13 11

Sample Output

1.714

HINT

Source

dupeng


題目的意思是找到一個sigma(G)/sigma(B)最大的hamilton回路。
典型的參數(shù)搜索。二分或者迭代答案就可以了。

Solution:

#include <stdio.h>
#include 
<queue>
#include 
<cmath>
using namespace std;

const double EPS = 1e-4;
const int N = 15;
const int M = N * N;

#define Max(a, b) (a
>b?a:b)

inline 
int dblcmp(double a, double b) {
    
if(fabs(a-b) < EPS) return 0;
    
return a < b ? -1 : 1;
}

struct Node 
{
    
int x, mask;
    
double s;
    Node() {}
    Node(
int mm, int xx, double ss) {
        x 
= xx;
        mask 
= mm;
        s 
= ss;
    }
};

int n, m;

double adj[N][N];
int X[M], Y[M], G[M], B[M];

double dp[1<<N][N];

double go(double ans) {
    
int i, j;
    
for(i = 0; i < n; ++i) {
        adj[i][i] 
= 0;
        
for(j = i+1; j < n; ++j) {
            adj[i][j] 
= adj[j][i] = -10e300;
        }
    }
    
for(i = 0; i < m; ++i) {
        adj[X[i]
-1][Y[i]-1= G[i]-ans * B[i];
        adj[Y[i]
-1][X[i]-1= adj[X[i]-1][Y[i]-1];
    }

    
for(i = 0; i < (1<<n); ++i) {
        
for(j = 0; j < n; ++j)
            dp[i][j] 
= -10e100;
    }
    queue
<Node> Q;
    
for(i = 0; i < n; ++i) {
        Q.push(Node(
1<<i, i, 0.0));
        dp[
1<<i][i] = 0;
    }
    
while(Q.size()) {
        
int f = Q.front().mask, x = Q.front().x;
        
double s = Q.front().s;
        
double& d = dp[f][x];
        Q.pop();
        
if(s < d) continue;
        
for(i = 0; i < n; ++i) if((f&(1<<i)) == 0) {
            
if(dp[f|1<<i][i] < s + adj[x][i]) {
                dp[f
|1<<i][i] = s + adj[x][i];
                Q.push(Node(f
|1<<i, i, s + adj[x][i]));
            }
        }
    }

    
double max = -10e100;
    
for(i = 0; i < n; ++i) {
        max 
= Max(max, dp[(1<<n)-1][i]);
    }
    
return max;
}

int main()
{
    
// freopen("t.in", "r", stdin);

    
int i;
    
double ans;
    
while(scanf("%d %d"&n, &m) != EOF) {
        
double min = 2000, max = 0;
        
for(i = 0; i < m; ++i) {
            scanf(
"%d %d %d %d"&X[i], &Y[i], &G[i], &B[i]);
            
if(B[i] < min) min = B[i];
            
if(G[i] > max) max = G[i];
        }
        
double lo = 0, hi = max/min;
        
int ok = 0;
        
for(i = 0; ; ++i) {
            
double mid = lo + (hi-lo)/2;
            
if(dblcmp((ans=go(mid)), 0.0> 0) {
                lo 
= mid;
            } 
else if(dblcmp(ans, 0.0== 0) {
                printf(
"%.3lf\n", mid);
                ok 
= 1;
                
break;
            } 
else {
                hi 
= mid;
            }
        }

        
if(!ok) { int a = 0; a = 1/a; }
    }

    
return 0;
}

 


Feedback

# re: 基本參數(shù)搜索  回復  更多評論   

2008-06-04 13:43 by w
你好,這個程序我看不懂……能講一下思路嗎?

# re: 基本參數(shù)搜索  回復  更多評論   

2008-06-04 14:56 by oyjpart
你可以參考《算法藝術(shù)與信息學競賽》303-304頁
3.地震--最有比率生成樹 一節(jié)的解答
和這個非常類似

就是2分枚舉那個答案,然后將除的表達式的權(quán) 轉(zhuǎn)化成+-*表達式的權(quán),再這個基礎(chǔ)上求目標函數(shù)。 如果目標函數(shù) != 0,則枚舉的答案應該向使目標函數(shù)更接近0的方向取值,

go函數(shù)實際求的就是最大權(quán)的hamilton回路。用的是基本的壓縮狀態(tài)廣搜。

# re: 基本參數(shù)搜索  回復  更多評論   

2008-06-04 15:02 by Surfing
我的解法

#include <stdio.h>

#define N 13

typedef struct _T_AdjNode
{
int nBoys;
int nGirls;
double dRatio;
}TAdjNode;

TAdjNode g_AdjNode[N][N];
int g_Path[2][N];
int g_PathIndex[2] = {0};
double g_dRatio[2] = {0.0};
int nCities, nRoads;

int FindNextNode(int nPathIndex, int nLine)
{
double dRatio = 0;
int nNode = 0;
int i = 0;
int j = 0;
bool bExist = false;

for (j = 0; j < nCities; j++)
{
for (i = 0; i < g_PathIndex[nPathIndex]; i++)
{
if (j == g_Path[nPathIndex][i])
{
bExist = true;
break;
}
}
if (bExist)
{
bExist = false;
continue;
}
if (g_AdjNode[nLine][j].dRatio > dRatio)
{
dRatio = g_AdjNode[nLine][j].dRatio;
nNode = j;
}
}

return nNode;
}

int FindPath(int nPathIndex, int nNode)
{
int nNextNode = 0;
static int nBoys = 0, nGirls = 0;

g_Path[nPathIndex][g_PathIndex[nPathIndex]] = nNode;
g_PathIndex[nPathIndex]++;
if (g_PathIndex[nPathIndex] >= nCities)
{
g_dRatio[nPathIndex] = (double)nGirls / nBoys;
return 0;
}

nNextNode = FindNextNode(nPathIndex, nNode);
nBoys += g_AdjNode[nNode][nNextNode].nBoys;
nGirls += g_AdjNode[nNode][nNextNode].nGirls;
FindPath(nPathIndex, nNextNode);

return 0;
}

int main()
{
int i,j,nGirls,nBoys;
char q = '0';
int nPathIndex = 0;

nCities = nRoads = 0;
i = j = nGirls = nBoys = 0;

printf("Input the number of cities and roads:\n");
scanf("%d %d", &nCities, &nRoads);

if (nCities < 1 || nRoads < 1)
{
return 1;
}

do
{
printf("Input the road index and the number of girls and boys sequentially : "
"from to girls boys\n");
scanf("%d %d %d %d", &i, &j, &nGirls, &nBoys);
getchar();

g_AdjNode[i - 1][j - 1].nBoys = nBoys;
g_AdjNode[i - 1][j - 1].nGirls = nGirls;
g_AdjNode[i - 1][j - 1].dRatio = (double)nGirls / nBoys;
g_AdjNode[j - 1][i - 1].nBoys = nBoys;
g_AdjNode[j - 1][i - 1].nGirls = nGirls;
g_AdjNode[j - 1][i - 1].dRatio = g_AdjNode[i - 1][j - 1].dRatio;

printf("Input finished?(y/n)");
scanf("%c", &q);
getchar();
} while ('y' != q);

//process here
nPathIndex = 0;
for (i = 0; i < nCities; i++)
{
FindPath(nPathIndex, 0);
nPathIndex = g_dRatio[0] <= g_dRatio[1] ? 0 : 1;
g_PathIndex[nPathIndex] = 0;
}

//output the result
nPathIndex = g_dRatio[0] >= g_dRatio[1] ? 0 : 1;
printf("The max ratio is %.3lf\n", g_dRatio[nPathIndex]);\
printf("The best path : \n");
for (i = 0; i < nCities; i++)
{
printf("%d\t", g_Path[nPathIndex][i]);
}
printf("\n");

return 0;
}

# re: 基本參數(shù)搜索  回復  更多評論   

2008-06-04 15:10 by Surfing
一點小問題,更正一下

if (g_PathIndex[nPathIndex] >= nCities)
{
g_dRatio[nPathIndex] = (double)nGirls / nBoys;
nGirls = nBoys = 0;
return 0;
}

# re: 基本參數(shù)搜索  回復  更多評論   

2008-06-04 17:13 by oyjpart
@Surfing
嘿嘿,謝謝分享

# re: 基本參數(shù)搜索  回復  更多評論   

2008-06-05 22:27 by w
多謝,受教了

# re: 基本參數(shù)搜索  回復  更多評論   

2008-06-05 23:07 by oyjpart
不謝

# re: 基本參數(shù)搜索  回復  更多評論   

2008-06-09 23:54 by richardxx
我做了百度那題,但比賽完才想起我貼的那個模版有點問題,最后果然只有4.5分,和沒做沒區(qū)別~~

# re: 基本參數(shù)搜索  回復  更多評論   

2008-06-10 12:03 by oyjpart
@richardxx
呵呵 進復賽了就可以了不 看我們這種初賽就被水掉的菜菜。。

# re: 基本參數(shù)搜索  回復  更多評論   

2008-06-10 20:01 by 小Young
跟著大牛漲經(jīng)驗值!

# re: 基本參數(shù)搜索  回復  更多評論   

2008-06-10 20:34 by oyjpart
汗。。。
您謙虛了。。。

# re: 基本參數(shù)搜索  回復  更多評論   

2008-06-11 19:12 by 小Young
請問這題你用隊列有什么用途啊?
這題不用隊列也可以啊.

# re: 基本參數(shù)搜索  回復  更多評論   

2008-06-11 22:19 by oyjpart
@ 小Young
就是廣搜用的隊列
不用隊列你的意思是深搜么?

# re: 基本參數(shù)搜索  回復  更多評論   

2008-07-26 06:09 by lengbufang
看看!!!
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲国产精品一区制服丝袜 | 久久久久成人精品| 久久久欧美精品| 欧美日韩国产不卡在线看| 久久婷婷久久| 国产精品区一区| 亚洲国产一区二区三区a毛片| 国产欧美日韩一区二区三区在线| 亚洲激情在线激情| 亚洲第一视频网站| 久久精品国产欧美亚洲人人爽 | 亚洲日本视频| 玖玖精品视频| 久久综合国产精品| 狠狠久久五月精品中文字幕| 亚洲天堂av综合网| 亚洲视频一区二区| 欧美日韩免费观看一区| 亚洲国产aⅴ天堂久久| 尤物九九久久国产精品的分类| 亚洲欧美日韩天堂| 18成人免费观看视频| 欧美一区三区二区在线观看| 午夜在线一区二区| 国产精品日韩欧美一区二区三区| 99精品久久| 一区二区三区久久精品| 欧美日韩国产成人精品| 亚洲高清不卡| 亚洲伦理中文字幕| 欧美激情亚洲精品| 亚洲精品一区二区网址| 亚洲精品国产日韩| 欧美黑人在线观看| 亚洲精品一区二| 亚洲午夜一区| 国产精品无码专区在线观看| 亚洲欧美文学| 久久久久se| 亚洲破处大片| 欧美精品在线免费播放| 一区二区三区四区五区视频| 国产免费一区二区三区香蕉精| 亚洲小说春色综合另类电影| 欧美一站二站| 亚洲国产1区| 欧美日韩人人澡狠狠躁视频| 亚洲性视频网址| 美女999久久久精品视频| 亚洲国产专区校园欧美| 欧美日韩一区二区三区四区五区 | 国产一区二区三区在线观看免费 | 宅男66日本亚洲欧美视频| 亚洲欧美日韩一区在线观看| 国产亚洲成人一区| 久久综合久久综合九色| 99精品99| 久久国产日韩| 亚洲精品国产日韩| 国产精品欧美激情| 久热精品视频在线免费观看| 日韩视频三区| 狼狼综合久久久久综合网| 亚洲精品免费看| 国产精品一区二区三区久久久| 久久久久欧美精品| 99精品国产在热久久| 美女国产一区| 午夜在线观看欧美| 亚洲精品美女久久7777777| 欧美性色aⅴ视频一区日韩精品| 欧美在线免费看| 亚洲免费观看高清完整版在线观看| 午夜日韩福利| 99国产精品一区| 国内精品久久久久久久影视蜜臀| 欧美剧在线观看| 久久久久久久网站| 亚洲无毛电影| 亚洲精品在线视频| 欧美大片一区| 久久久久久久久久看片| 亚洲一区二区三区四区中文| 亚洲国产高清在线| 国产日韩欧美在线播放不卡| 欧美日韩少妇| 欧美高清在线视频观看不卡| 欧美一区网站| 亚洲午夜精品久久久久久浪潮| 亚洲国产日韩欧美| 免费黄网站欧美| 久久天堂成人| 久久久免费精品视频| 欧美一级视频精品观看| 亚洲一区二区三区久久| 亚洲三级电影在线观看| 亚洲国产天堂久久国产91| 黄色成人av网| 狠狠色噜噜狠狠狠狠色吗综合| 国产精品女主播在线观看| 国产精品分类| 国产精品a级| 欧美四级剧情无删版影片| 亚洲天堂偷拍| 一区二区欧美国产| 99re6这里只有精品| 亚洲理论在线| 99精品视频免费观看| 亚洲精品视频在线观看免费| 亚洲国产精品一区二区久| 亚洲大胆av| 午夜视频在线观看一区二区| 亚洲天堂激情| 午夜精品久久久久久久99樱桃| 亚洲午夜精品| 亚洲欧美中文日韩在线| 午夜精品福利电影| 欧美一区二区三区久久精品茉莉花| 午夜视频一区在线观看| 久久av在线看| 久久综合伊人77777蜜臀| 久久综合久久综合这里只有精品 | 性xx色xx综合久久久xx| 午夜在线电影亚洲一区| 久久成人精品一区二区三区| 久久久久一区二区| 欧美黄色影院| 日韩午夜中文字幕| 亚洲小说春色综合另类电影| 欧美在线免费观看亚洲| 蜜桃久久av一区| 欧美视频在线观看免费网址| 国产精品永久免费视频| 又紧又大又爽精品一区二区| 亚洲日产国产精品| 午夜视频在线观看一区二区三区| 久久婷婷国产麻豆91天堂| 亚洲大片在线| 亚洲欧美成人综合| 久久久久久久波多野高潮日日| 免播放器亚洲| 国产精品日韩| 亚洲欧洲综合另类| 午夜精品一区二区三区四区| 久热爱精品视频线路一| 日韩一区二区精品| 久久久久久久久久久一区| 欧美久久电影| 精品91在线| 亚洲网友自拍| 欧美 亚欧 日韩视频在线| 99伊人成综合| 老色批av在线精品| 国产精品日本欧美一区二区三区| 精品动漫3d一区二区三区| 中文国产亚洲喷潮| 久久最新视频| 亚洲永久免费精品| 欧美日本国产| 在线成人中文字幕| 午夜精品久久久久久| 亚洲国产欧美日韩| 久久国产精品72免费观看| 欧美日韩亚洲成人| 亚洲大胆av| 久久久久久亚洲综合影院红桃 | 欧美午夜无遮挡| 在线激情影院一区| 久久不射网站| 一区二区欧美日韩| 欧美激情视频一区二区三区在线播放 | 欧美日韩精品伦理作品在线免费观看| 国产一区二区三区在线观看网站| 亚洲网友自拍| 亚洲精品久久| 欧美jizzhd精品欧美巨大免费| 国产日韩欧美日韩大片| 亚洲永久在线| 亚洲精品资源| 欧美大尺度在线观看| 在线观看国产精品淫| 久久精品国产精品| 亚洲女同精品视频| 国产精品国产三级国产专播精品人 | 精品二区视频| 久久精品导航| 亚洲男同1069视频| 国产精品高潮呻吟久久av无限 | 欧美一区二区三区免费视频| 欧美四级在线观看| 一区二区三区日韩欧美| 亚洲精品欧洲精品| 欧美精品入口| 一本色道精品久久一区二区三区| 欧美好吊妞视频| 欧美va亚洲va日韩∨a综合色| 在线播放中文一区| 欧美77777| 免费久久久一本精品久久区| 亚洲黄色天堂|