青蛙
思路:单源最短路,两两之间取max
floyd
//5552ms
pair<int, int> p[210];
double dist[210][210];
int t;
int pre[210];
int main() {
IOS;
int cnt = 1;
while (cin >> t && t) {
re(p);
re(dist);
re(pre);
for (int i = 1; i <= t; ++i)
cin >> p[i].first >> p[i].second;
//求距离
for (int i = 1; i <= t - 1; ++i) {//这里注意范围,否则要错
for (int j = i + 1; j <= t; ++j) {
dist[i][j] = dist[j][i] = sqrt((p[i].first - p[j].first) * (p[i].first - p[j].first) + (p[i].second - p[j].second) *
(p[i].second - p[j].second));
}
}
//floyd
for (int k = 1; k <= t; ++k) {
for (int i = 1; i <= t - 1; ++i) {//范围
for (int j = i + 1; j <= t; ++j) {
if (dist[i][k] < dist[i][j] && dist[k][j] < dist[i][j])
dist[i][j] = dist[j][i] = max(dist[i][k], dist[k][j]);
}
}
}
printf("Scenario #%d\n", cnt++);
printf("Frog Distance = %.3f\n\n", dist[1][2]);
}
return 0;
}
dij
太久没用优先队列都不会了orz优先队列用法
最大的收获是:在while里面定义,记得初始化,最好用全int,最后再改值
//1947ms
pair<int, int> p[210];
int t;
int dis[210];
bool vis[210];
struct node{
int j, dist;
};
int main() {
IOS;
int cnt = 1;
while (cin >> t && t) {
re(p);
remax(dis);
re(vis);
vector<node> a[210];
for (int i = 1; i <= t; ++i)
cin >> p[i].first >> p[i].second;
for(int i = 1; i <= t; ++i){
for (int j = i + 1; j <= t; ++j){
if(i != j){
int w = (p[i].first - p[j].first) * (p[i].first - p[j].first) + (p[i].second - p[j].second) *
(p[i].second - p[j].second);
a[i].push_back({j, w});
a[j].push_back({i, w});
}
}
}
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q;
q.push({0, 1});
dis[1] = 0;
while(!q.empty()){
int now = q.top().second;
q.pop();
if(vis[now])
continue;
vis[now] = true;
for(auto w : a[now]){
int j = w.j;
if(dis[j] > max(dis[now], w.dist)){
dis[j] = max(dis[now], w.dist);
q.push({dis[j], j});
}
}
}
printf("Scenario #%d\n", cnt++);
printf("Frog Distance = %.3f\n\n", sqrt(dis[2]));
}
return 0;
}
货物运输
和上一道思路一模一样,怎么说呢,做了和没做好像没有什么区别,还给我整焦虑了
struct node{
int v, w;
};
bool vis[1005];
int dist[1005];
void dij(vector<node> v[]){
re(vis);
re(dist);
priority_queue<pair<int, int>> q;
q.push({2e9,1});
dist[1] = 2e9;//相当于要求的是最大的最长的路径,和上一题唯一不同点
while(!q.empty()){
pair<int, int> temp = q.top();
q.pop();
if(vis[temp.second])
continue;
vis[temp.second] = true;
for(auto w : v[temp.second]){
int v = w.v;
if(dist[v] < min(dist[temp.second], w.w)){
dist[v] = min(dist[temp.second], w.w);
q.push({dist[v], v});
}
}
}
}
int main() {
IOS;
// freopen("P1908_6.in","r",stdin);//读入数据
// freopen("P1908.out","w",stdout); //输出数据
int t;
cin >> t;
for(int c = 1; c <= t; ++c){
int n, m;
cin >> n >> m;
//来建图
vector<node> v[1005];
for (int i = 1; i <= m; ++i){
int a, b, c;
cin >> a >> b >> c;
v[a].push_back({b, c});
v[b].push_back({a, c});
}
dij(v);
printf("Scenario #%d:\n",c);
printf("%d\n\n", dist[n]);
}
return 0;
}
最小值中的最大值初始化: ans = 0;
最大值中的最小值出初始化: ans = 0x3f3f3f;
然后ans逐渐缩小范围,得到最优解