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

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

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

基本參數搜索

Posted on 2008-06-03 15:45 oyjpart 閱讀(3140) 評論(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回路。
典型的參數搜索。二分或者迭代答案就可以了。

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: 基本參數搜索  回復  更多評論   

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

# re: 基本參數搜索  回復  更多評論   

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

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

go函數實際求的就是最大權的hamilton回路。用的是基本的壓縮狀態廣搜。

# re: 基本參數搜索  回復  更多評論   

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: 基本參數搜索  回復  更多評論   

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

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

# re: 基本參數搜索  回復  更多評論   

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

# re: 基本參數搜索  回復  更多評論   

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

# re: 基本參數搜索  回復  更多評論   

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

# re: 基本參數搜索  回復  更多評論   

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

# re: 基本參數搜索  回復  更多評論   

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

# re: 基本參數搜索  回復  更多評論   

2008-06-10 20:01 by 小Young
跟著大牛漲經驗值!

# re: 基本參數搜索  回復  更多評論   

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

# re: 基本參數搜索  回復  更多評論   

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

# re: 基本參數搜索  回復  更多評論   

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

# re: 基本參數搜索  回復  更多評論   

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| 亚洲国产精品久久91精品| 亚洲毛片在线免费观看| 国产精品自拍网站| 欧美大片在线看| 国产精品免费区二区三区观看| 久久婷婷久久| 欧美理论电影在线观看| 欧美一区二区视频观看视频| 欧美成人xxx| 久久精品99国产精品| 欧美88av| 久久婷婷色综合| 欧美日韩一区二区视频在线| 久久综合影音| 国产精品一页| 亚洲精品黄色| 黄色日韩在线| 亚洲在线黄色| 在线一区二区三区四区| 久久免费视频网站| 欧美一区二粉嫩精品国产一线天| 久久夜色精品国产欧美乱极品| 亚洲自拍偷拍色片视频| 欧美成人日韩| 狂野欧美性猛交xxxx巴西| 国产精品女人网站| 亚洲精品一区二区在线| 亚洲国产精品悠悠久久琪琪 | 亚洲国产精品一区二区三区| 亚洲欧美日韩精品| 亚洲欧美日韩国产成人| 欧美精品在线一区二区| 欧美国产欧美亚洲国产日韩mv天天看完整 | 在线观看成人网| 亚洲在线一区二区三区| 一区二区欧美日韩| 欧美国产激情| 欧美国产综合一区二区| 一区二区三区在线免费观看| 亚洲欧美一区二区激情| 亚洲专区免费| 欧美性做爰毛片| 夜夜嗨av一区二区三区免费区 | 欧美日韩成人综合在线一区二区| 欧美成人a视频| 亚洲福利视频免费观看| 久久久亚洲精品一区二区三区| 久久精品在线视频| 国语自产精品视频在线看一大j8 | 亚洲裸体在线观看| 免费欧美视频| 麻豆国产va免费精品高清在线| 国产午夜精品全部视频播放| 欧美一级电影久久| 久久男人资源视频| 亚洲第一伊人| 欧美高清视频一区二区| 亚洲精品一级| 亚洲欧美日韩国产综合在线| 国产精品欧美一区喷水| 欧美在线视频免费| 欧美黄色aa电影| 亚洲福利在线看| 欧美高清在线一区二区| 99国产精品久久久久久久成人热| 亚洲午夜精品久久| 欧美午夜片欧美片在线观看| 亚洲综合日韩中文字幕v在线| 久久精品国产免费看久久精品| 国产中文一区二区三区| 久久久久一区二区三区| 亚洲国产91| 亚洲一区二区精品| 国产一区二区高清视频| 欧美成人激情视频| 亚洲网在线观看| 老司机一区二区| 日韩网站在线| 国产亚洲一区在线| 欧美精品在线极品| 欧美亚洲免费电影| 亚洲国产黄色片| 欧美在线播放| 亚洲欧洲日韩女同| 国产精品揄拍500视频| 蜜桃av噜噜一区| 亚洲综合国产| 亚洲欧洲一区二区三区久久| 久久xxxx精品视频| 99在线视频精品| 黄色精品一区二区| 国产精品理论片| 欧美成人精品影院| 亚欧成人在线| 一区二区三区精品国产| 欧美成人资源| 久久精品欧美日韩| 亚洲视频成人| 最新中文字幕亚洲| 黄色资源网久久资源365| 欧美性色综合| 欧美激情国产日韩精品一区18| 午夜在线a亚洲v天堂网2018| 亚洲精品美女91| 欧美成人精品h版在线观看| 性一交一乱一区二区洋洋av| 一本色道久久88亚洲综合88| 亚洲第一精品夜夜躁人人爽| 国产视频一区免费看| 国产精品hd| 欧美色中文字幕| 欧美高清在线一区| 蜜桃av一区二区三区| 久久久国产精品亚洲一区| 羞羞色国产精品| 亚洲欧美偷拍卡通变态| 亚洲在线一区二区三区| 亚洲天堂偷拍| 夜色激情一区二区| 99国产精品国产精品久久| 亚洲国产高清高潮精品美女| 免费在线成人av| 男人插女人欧美| 免费不卡在线视频| 老司机一区二区三区| 久久一区二区三区四区五区| 久久久久久久一区二区三区| 久久精品理论片| 久久精品一二三| 六月天综合网| 欧美激情国产精品| 亚洲国产高清一区| 亚洲日本国产| 亚洲九九九在线观看| 亚洲另类春色国产| 宅男精品视频| 午夜国产精品视频| 久久久久免费视频| 免播放器亚洲| 欧美色中文字幕| 国产视频精品免费播放| 在线日韩av永久免费观看| 91久久精品一区二区别| 夜夜躁日日躁狠狠久久88av| 亚洲女爱视频在线| 久久久精品国产免费观看同学| 蜜桃久久av| 亚洲精品乱码久久久久| 亚洲一区二区成人| 久久久久久一区| 欧美日韩精品免费观看视频完整| 国产精品www994| 极品尤物久久久av免费看| 最新国产精品拍自在线播放| 亚洲性人人天天夜夜摸| 久久久国产精品亚洲一区| 亚洲国产精品一区二区第四页av | 久久精品国产久精国产思思 | 亚洲男人av电影| 女人色偷偷aa久久天堂| 欧美三级日韩三级国产三级 | 麻豆成人在线播放| 国产精品s色| 亚洲国产午夜| 久久精品一区蜜桃臀影院 | 欧美高清视频www夜色资源网| 日韩视频中文| 久久亚洲综合色| 国产精品免费视频观看| 亚洲乱码国产乱码精品精98午夜| 午夜在线电影亚洲一区| 亚洲国产日韩在线| 欧美在线黄色| 国产精品高清免费在线观看| 亚洲国产岛国毛片在线| 欧美专区亚洲专区| 亚洲精选在线| 模特精品裸拍一区| 好吊成人免视频| 欧美一区亚洲二区| 99re在线精品| 欧美成人一二三| 在线观看精品视频| 久久精品女人| 亚洲免费视频成人| 国产精品www|