我是靠谱客的博主 温柔小蝴蝶,最近开发中收集的这篇文章主要介绍POJ3268-Silver Cow Party-(Dijstra),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题意:有n只牛聚会,每只牛的家有编号,指定去一只牛家里聚会。牛很懒,走最短路去,花费时间最少。而回来的时间又不相同,问那只走最远的牛走了多久?

解题:去某只牛家里聚会,单源求最短路,来回时间不同,用有向边表示。颠倒一下每条边,则可以得到 去和回 两次最短路,暴力求最大时间。

//记录模板

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<math.h>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<set>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
int n,m,s;
int d[1005],d1[1005],d2[1005];
int a[1005][1005];
bool vis[1005];
void Dijkstra()
{
memset(vis,false,sizeof(vis));
memset(d,inf,sizeof(d));
d[s]=0;
while(true)
{
int v=-1;
for(int u=1;u<=n;u++)
{
if( !vis[u] && ( v==-1 || d[u]<d[v] ) )
v=u;
}
if(v==-1)
break;
vis[v]=true;
for(int u=1;u<=n;u++)
d[u]=min(d[u],d[v]+a[v][u]);
}
}
int main()
{
while(scanf("%d%d%d",&n,&m,&s)!=EOF)
{
memset(a,inf,sizeof(a));
for(int i=1;i<=n;i++)
a[i][i]=0;
for(int i=1;i<=m;i++)
{
int x,y,z;
scanf("%d %d %d",&x,&y,&z);
a[x][y]=min(a[x][y],z);
}
Dijkstra();
for(int i=1;i<=n;i++)///第一次的结果 传给d1
d1[i]=d[i];
///置换矩阵
for(int i=1;i<=n;i++)
for(int j=1;j<i;j++)///下三角矩阵转换即可

swap(a[i][j],a[j][i]);
Dijkstra();///从s到各点最短路 即 返回的最短路
int maxx=-inf;
for(int i=1;i<=n;i++)
maxx=max(maxx,d1[i]+d[i]);
printf("%dn",maxx);
}
return 0;
}
Dijkstra模板

 

转载于:https://www.cnblogs.com/shoulinniao/p/11219809.html

最后

以上就是温柔小蝴蝶为你收集整理的POJ3268-Silver Cow Party-(Dijstra)的全部内容,希望文章能够帮你解决POJ3268-Silver Cow Party-(Dijstra)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(26)

评论列表共有 0 条评论

立即
投稿
返回
顶部