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

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
你可以參考《算法藝術與信息學競賽》303-304頁
3.地震--最有比率生成樹 一節(jié)的解答
和這個非常類似

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

go函數(shù)實際求的就是最大權的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
跟著大牛漲經驗值!

# 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>
            国产综合久久| 欧美日韩理论| 国产一区二区久久久| 亚洲在线视频| 一二三区精品福利视频| 欧美三级午夜理伦三级中视频| 亚洲精品国久久99热| 欧美激情亚洲精品| 久久躁日日躁aaaaxxxx| 亚洲国产精品一区| 亚洲激情啪啪| 免费观看日韩av| 夜夜嗨av一区二区三区四区| 亚洲开发第一视频在线播放| 欧美三级网址| 久久久久久亚洲精品中文字幕| 欧美专区在线观看| 91久久精品美女高潮| 亚洲精品久久7777| 国产精品一区=区| 麻豆成人在线观看| 欧美国产日韩精品免费观看| 亚洲视频网在线直播| 午夜精品一区二区在线观看| 精品91久久久久| 亚洲精品国产精品国自产观看| 国产精品video| 久久人人精品| 欧美色综合网| 久久一区免费| 欧美三级欧美一级| 欧美 日韩 国产精品免费观看| 欧美精品一区二区三区蜜臀| 欧美中文字幕久久| 欧美精品一区二区三区视频| 久久国产婷婷国产香蕉| 欧美国产视频在线| 久久成年人视频| 欧美欧美天天天天操| 久久av一区二区三区漫画| 欧美国产成人在线| 久久香蕉国产线看观看av| 欧美日韩国产在线播放| 鲁大师成人一区二区三区| 欧美日韩专区| 亚洲国产精品精华液网站| 国产综合视频在线观看| 一本色道久久88综合日韩精品| 1204国产成人精品视频| 亚洲欧美精品伊人久久| 亚洲免费av片| 久久一区二区三区av| 香蕉免费一区二区三区在线观看 | 亚洲欧美在线另类| 欧美成人高清| 老鸭窝毛片一区二区三区| 国产精品欧美久久久久无广告| 欧美激情一区二区三区不卡| 国产一区日韩欧美| 中国av一区| 在线视频一区观看| 欧美大片在线看免费观看| 麻豆亚洲精品| 国产有码在线一区二区视频| 亚洲一区二区网站| 亚洲婷婷综合色高清在线| 欧美国产日韩a欧美在线观看| 欧美不卡在线| 136国产福利精品导航网址应用 | 蜜臀av在线播放一区二区三区| 国产精品外国| 亚洲免费综合| 久久精品国产免费| 国产欧美精品一区| 午夜精品亚洲| 久久国产婷婷国产香蕉| 国产一区二区按摩在线观看| 性欧美8khd高清极品| 久久国产主播精品| 黄色日韩在线| 久久综合影音| 亚洲高清视频在线观看| 亚洲精品中文字幕有码专区| 欧美成人精品| 亚洲精品孕妇| 亚洲图片激情小说| 国产精品免费区二区三区观看| 亚洲在线视频观看| 久久久噜噜噜久久久| 樱桃成人精品视频在线播放| 久久久亚洲高清| 亚洲人成人99网站| 亚洲欧美精品在线观看| 国产精品亚洲一区| 久久久久久午夜| 亚洲国产日韩在线一区模特| 中文亚洲字幕| 国产视频综合在线| 久久综合免费视频影院| 亚洲人成毛片在线播放| 亚洲欧美一区二区三区在线| 国产一级揄自揄精品视频| 玖玖精品视频| 在线亚洲激情| 免费在线成人| 亚洲一区二区三区免费视频| 国产综合色产在线精品| 欧美精品123区| 性做久久久久久免费观看欧美| 欧美成人网在线| 亚洲一区二区三区精品动漫| 伊人久久婷婷| 国产精品伦理| 免费亚洲电影在线| 亚洲欧美影音先锋| 亚洲黑丝一区二区| 久久精品人人爽| 一区二区三区毛片| 在线观看91精品国产入口| 欧美视频在线免费看| 噜噜噜躁狠狠躁狠狠精品视频| 一区二区欧美日韩视频| 欧美大片免费观看| 欧美亚洲一区在线| 日韩亚洲国产欧美| 精品电影在线观看| 国产精品视频专区| 欧美日本一区| 美国成人直播| 久久国产精彩视频| 亚洲一区在线直播| 亚洲久久成人| 亚洲精品视频一区二区三区| 蜜臀99久久精品久久久久久软件| 亚洲欧美一区二区在线观看| 日韩视频在线你懂得| 亚洲第一区在线| 国产专区欧美精品| 国产欧美在线观看| 国产精品久久久久aaaa九色| 欧美日本高清| 欧美激情1区2区3区| 久热国产精品| 久久―日本道色综合久久| 欧美一区二区三区男人的天堂| 亚洲香蕉网站| 亚洲小少妇裸体bbw| 一本久久知道综合久久| 日韩亚洲欧美在线观看| 91久久久在线| 亚洲久久一区二区| 一区二区不卡在线视频 午夜欧美不卡在| 欧美成人一区二免费视频软件| 麻豆91精品| 亚洲国产精品高清久久久| 国产美女精品| 欧美亚洲成人网| 国产精品a级| 国产精品美女久久久久aⅴ国产馆| 欧美日韩在线观看一区二区三区| 欧美日韩精品中文字幕| 欧美日韩大片| 国产精品卡一卡二| 国产女优一区| 黄色工厂这里只有精品| 在线观看欧美精品| 亚洲精品一品区二品区三品区| 亚洲美女91| 亚洲欧美日韩系列| 久久久久成人精品| 欧美成人福利视频| 亚洲激情视频网站| 亚洲天堂成人在线观看| 小黄鸭视频精品导航| 美女国产精品| 国产精品成人免费视频 | 欧美黄色一区二区| 欧美三级韩国三级日本三斤| 国产精品久久一卡二卡| 国内激情久久| 日韩午夜电影av| 欧美在线播放| 亚洲高清av| 亚洲专区在线| 免费日韩视频| 国产精品毛片大码女人| 极品日韩久久| 亚洲一区区二区| 老司机一区二区| 亚洲少妇最新在线视频| 久久视频一区| 国产精品美女久久久久久2018 | 国产精品成人aaaaa网站| 国产亚洲制服色| 中日韩高清电影网| 欧美a一区二区| 亚洲一区三区在线观看| 欧美成人日韩| 国产一区二区三区高清播放| 99综合精品|