牛客練習賽17 A E 最短路 列舉

2021-08-19 17:51:37 字數 3626 閱讀 9319

時間限制:c/c++ 1秒,其他語言2秒

空間限制:c/c++ 32768k,其他語言65536k

64bit io format: %lld

題目描述

給出共享長方體乙個頂點的三個面的面積,求它十二條邊的邊長和。

輸入描述:

一行三個整數a, b, c表示面積(1 <= a, b, c <= 10000)。

輸出描述:

一行乙個整數表示邊長和。

示例1

輸入 1 1 1

輸出 12

示例2

輸入 4 6 6

輸出 28

**

#include 

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

typedef

unsigned

long

long ull;

const

int n = (int) 10000 + 11;

const

int m = (int) 1e6 + 11;

const

int mod = (int) 1e9 + 7;

const

int inf = 0x3f3f3f3f;

int main()}}

}return

0;}

時間限制:c/c++ 3秒,其他語言6秒

空間限制:c/c++ 262144k,其他語言524288k

64bit io format: %lld

題目描述

給定一幅n個點m條邊的圖和s個一定要經過的點,問從0號點出發,經過這s個點再回到0號點的最短路徑長度是多少。

輸入描述:

第一行乙個整數t(t <= 2)表示資料組數。

對於每組資料,第一行兩個整數n,m表示點數和邊數(1 <= n, m <= 100,000)。

接下來m行,每行三個整數x, y, z(0 < x, y < n, 0 <= z <= 1000)表示xy之間有一條長度為c的雙向邊;

接下來乙個整數s。(s<=10)

接下來s行每行乙個整數表示一定要經過的點。

資料保證有解。

輸出描述:

t行,每行乙個整數表示答案。

示例1

輸入 1

4 6

0 1 1

1 2 1

2 3 1

3 0 1

0 2 5

1 3 5

3 1

2 3

輸出 4

分析: 一開始看 感覺很像 優先佇列的bfs + 狀態壓縮 (感覺和之前做的很像),但是卻無限wa, 好吧, 通過這次,我明白了, 狀態壓縮 不能夠加 優先佇列的bfs,如果每次移動都是相同距離,那麼就可以用了。

就比如下面這個資料 就過不了。

1 4 6

0 1 1

1 2 1

2 3 1

3 0 1

0 2 5

1 3 5

2 2

3 出問題的點: 到達 2這個點的時候,一定是最短的,而且狀態正好是滿的(走完了所有關鍵點),但是它卻有一條邊直接走向了0,但是最短的路徑卻不是這個。

狀壓 + bfs的錯誤**

#include 

using

namespace

std;

const

int n = (int) 1e5 + 11;

const

int m = (int) 1e6 + 11;

struct node

node(int _id, int _step, int _state)

friend

bool

operator

< (node a, node b)

};struct edge

edge (int _from, int _to, int _val, int _next)

}edge[n * 2 + 1];

int head[n + 1], top; int n, m, ss;

void init()

void addedge(int a, int b, int c)

void getmap()

}bool vis[n + 1][(1

<< 11)];

map id; int full;

int bfs()

for(int i = head[now.id]; i != -1; i = edge[i].next)

}return -1;

}int main()

// printf("%d \n", full);

printf("%d\n", bfs());

}return

0;}

正解: 思路寫在了**中:

**

#include 

using

namespace

std;

const

int n = (int) 1e5 + 11;

const

int m = (int) 1e6 + 11;

struct edge

edge (int _from, int _to, int _val, int _next)

}edge[n * 2 + 1];

int head[n + 1], top; int n, m, ss;

void init()

void addedge(int a, int b, int c)

bool vis[n + 1]; int dis[n + 1];

int spfa(int s,int t)}}

}return dis[t];

}int dis[20][20], p[20];

int solve()

int ss; scanf("%d", &ss);

p[0] = 0;

for(int i = 1; i <= ss; i++ ) scanf("%d", &p[i]);

memset(dis, 0x3f, sizeof(dis));

for(int i = 0; i <= ss; i++)

}dis[0] = 0;

for(int i = 1; i <= ss; i++) dis[i] = i;

int ans = 0x3f3f3f3f;

dowhile(next_permutation(dis + 1, dis + ss + 1)) ;

return ans;

}int main()

return0;}

/*200

4 60 1 1

1 2 1

2 3 1

3 0 1

0 2 5

1 3 511

*/

牛客練習賽24 E 青蛙(最短路)

有乙隻可愛的老青蛙,在路的另一端發現了乙個黑的東西,想過去一 竟。於是便開始踏上了旅途 一直這個小路上有很多的隧道,從隧道的a進入,會從b出來,但是隧道不可以反向走。這只青蛙因為太老了,所以很懶,現在想請你幫幫慢,問他最少需要幾步才可以到達對面。將小徑看作一條數軸,青蛙初始在0上,這只青蛙可以向前跳...

牛客練習賽24 D 插排樹(最短路練習)

插排樹時間限制 c c 1秒,其他語言2秒 空間限制 c c 32768k,其他語言65536k 64bit io format lld 一年一度的山東省oi夏令營又開始了,每到這個季節,山東的oier們都會歡聚這裡,一起學 tu 習 fe 當然,為了能更加愉快地學 tu 習 fe 就少不了要自帶電...

牛客練習賽9

時間限制 c c 1秒,其他語言2秒 空間限制 c c 32768k,其他語言65536k 64bit io format lld 珂朵莉想每天都給威廉送禮物,於是她準備了n個自己的本子 她想送最多的天數,使得每天至少送乙個本子,但是相鄰兩天送的本子個數不能相同 珂朵莉最多送幾天禮物呢 第一行乙個整...