P3057 [USACO12NOV]Distant Pastures S [Dijkstra]

https://www.luogu.com.cn/problem/P3057
最短路
绿色题

思路:将这个图的(i,j)抽象成一个点,(i-1)*n+j 

将每个点连起来跑最短路


复制代码
#include <bits/stdc++.h> using namespace std; int n, s, p, x, y, h[910], dis[910], vis[910]; char a[35][35]; int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0}; struct node{ int x, y, z, next; }d[7510]; struct edge{ int p, d; bool operator < (const edge &A) const{ return A.d < d; } }; void add(int x, int y, int z){ d[++p].y = y, d[p].z = z, d[p].next = h[x], h[x] = p; } void dijkstra(int s){ memset(vis, 0, sizeof(vis)); memset(dis, 9, sizeof(dis)); priority_queue <edge> q; q.push((edge){s, 0}); dis[s] = 0; while (!q.empty()){ edge T = q.top(); q.pop(); if (vis[T.p]) continue; vis[T.p] = 1; for (int i=h[T.p]; i; i=d[i].next){ int sy = d[i].y; if (dis[sy] > dis[T.p] + d[i].z){ dis[sy] = dis[T.p] + d[i].z; q.push((edge){sy, dis[sy]}); } } } } int main(){ scanf ("%d%d%d", &n, &x, &y); for (int i=1; i<=n; i++){ for (int j=1; j<=n; j++){ cin >> a[i][j]; } } for (int i=1; i<=n; i++){ for (int j=1; j<=n; j++){ for (int k=0; k<4; k++){ int nx = i + dx[k], ny = j + dy[k]; if (nx <= 0 || ny <= 0 || nx > n || ny > n) continue; if (a[nx][ny] == a[i][j]) add((i-1)*n+j, (nx-1)*n+ny, x); else add((i-1)*n+j, (nx-1)*n+ny, y); } } } for (int i=1; i<=n; i++){ for (int j=1; j<=n; j++){ dijkstra((i-1)*n+j); for (int k=1; k<=n; k++){ for (int l=1; l<=n; l++){ s = max(s, dis[(k-1)*n+l]); } } } } printf ("%d\n", s); return 0; }
复制代码

 

 


__EOF__

本文作者灰の魔女伊蕾娜
本文链接https://www.cnblogs.com/2elaina/p/16545739.html
关于博主:编程小萌新一名,希望从今天开始慢慢提高,一步步走向技术的高峰!
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   -イレイナ  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示