标签:奶牛 Cow int 农场 maps dijkstra ans Party include
POJ 3268 Silver Cow Party
题目大意:
每个农场有一只奶牛,所有奶牛都要去指定的一个农场X中聚会,聚会结束后各自回自己的农场,
求所有的奶牛出门参加聚会再回到家中的最短用时,即求出耗时最长的奶牛的时间
具体思路:
最短路求解,先求x到各个农场的时间,再将各边反向,再求一次x到各个农场的时间。
将两个时间相加,最小的时间即为所求
(求图中所有点到指定点的最短距离可以转化为求指定点到所有点的最短距离,有向图要反向)
具体代码:
#include<iostream>
#include<cstdio>
#include<stdlib.h>
#include<algorithm>
using namespace std;
const int N = 1005;
const int INF = 1e5;
int maps[N][N];
int rmaps[N][N]; //反向图
int visit[N];
int dis[N];
int rdis[N];
int n, m, x;
void init()
{
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
rmaps[i][j] = maps[i][j] = INF;
}
void dijkstra(int d[], int maps[][N])
{
for (int i = 1; i <= n; i++)
visit[i] = 0;
for (int i = 1; i <= n; i++)
{
d[i] = maps[x][i];
}
d[x] = 0;
visit[x] = 1;
for (int i = 1; i <= n; i++)
{
int t = -1;
for (int j = 1; j <= n; j++)
{
if (!visit[j] && (t == -1 || d[t] > d[j]))
t = j;
}
if (t == -1)return;
visit[t] = 1;
for (int j = 1; j <= n; j++)
{
if (!visit[j] && d[j] > d[t] + maps[t][j])
d[j] = d[t] + maps[t][j];
}
}
}
int getAns()
{
int ans = -1;
for (int i = 1; i <= n; i++)
if (i != x && dis[i] + rdis[i] > ans)ans = dis[i] + rdis[i];
return ans;
}
int main()
{
cin >> n >> m >> x;
init();
for (int i = 1; i <= m; i++)
{
int a, b, w;
cin >> a >> b >> w;
if (w < maps[a][a]) //考虑重边
maps[a][b] = w;
rmaps[b][a] = w;
}
dijkstra(dis, maps);
dijkstra(rdis, rmaps);
printf("%d\n", getAns());
return 0;
}
三寸雪
发布了44 篇原创文章 · 获赞 34 · 访问量 1万+
私信
关注
标签:奶牛,Cow,int,农场,maps,dijkstra,ans,Party,include 来源: https://blog.csdn.net/weixin_44339734/article/details/104201021
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。