题目大意:

有N个农场每个农场要有一头牛去参加一个聚会,连接每个农场有m条路, 聚会地点是X,并且路是单向的.要求的是所有牛赶到聚会地点并且回到自己原先的农场所需要的最短时间。

题目分析:

其实就是以X为终点,求出X到其他每个点的距离, 再将图反存一下,在做一次最短路, 两次距离相加求出最长的时间。

这里是用Dijkstra写的,我们第一次用邻接矩阵写,第二次用邻接表,并且有优先队列优化

 #include <iostream>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
#define INF 0xfffffff
#define maxn 1005
int G[][maxn][maxn];
int dist[][maxn];
bool vis[][maxn];
int n, m, X;
void Dijkstra(int Star,int End,int k)
{
dist[k][Star] = ; for(int i=; i<=n; i++)
{
int Min = INF, index;
for(int j=; j<=n; j++)
{
if(dist[k][j] < Min && !vis[k][j])
Min = dist[k][j], index = j;
} vis[k][index] = true; for(int j=; j<=n; j++)
{
if(!vis[k][j])
dist[k][j] = min(dist[k][j], dist[k][index] + G[k][index][j]);
}
}
}
void Init()
{
memset(vis,false,sizeof(vis));
for(int i=; i<=n; i++)
{
dist[][i] = dist[][i] = INF;
for(int j=; j<=n; j++)
G[][i][j] = G[][j][i] = G[][i][j] = G[][j][i] = INF;
}
} int Slove()
{
int Max = ;
Dijkstra(X,n,);
Dijkstra(X,n,);
for(int i=; i<=n; i++)
{
Max = max(dist[][i]+ dist[][i], Max);
}
return Max;
}
int main()
{
while(scanf("%d%d%d",&n,&m,&X) != EOF)
{
Init();
for(int i=; i<m; i++)
{
int a, b, c;
scanf("%d%d%d",&a,&b,&c);
G[][a][b] = min(G[][a][b],c);
G[][b][a] = min(G[][b][a],c);
}
int ans = Slove(); cout << ans << endl;
}
return ;
}

优先队列版本

#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
#define INF 0xfffffff
#define maxn 1006
#define min(a,b) (a<b?a:b)
#define max(a,b) (a>b?a:b)
struct Edge
{
int e;
int w;
friend bool operator < (Edge n1, Edge n2)
{
return n1.w > n2.w;
}
};
vector<Edge>G[2][maxn]; int dist[2][maxn];
bool vis[2][maxn];
int n, m, X;
void Dijkstra(int Star,int End,int k)
{
Edge P, Pn;
P.e = Star;
P.w = 0;
dist[k][P.e] = 0;
priority_queue<Edge> Q;
Q.push(P); while( !Q.empty() )
{
P = Q.top();
Q.pop(); if( vis[k][P.e] )
continue; vis[k][P.e] = true; int len = G[k][P.e].size(); for(int i=0; i<len; i++)
{
Pn.e = G[k][P.e][i].e;
Pn.w = G[k][P.e][i].w + P.w;
if( !vis[k][Pn.e] )
{
dist[k][Pn.e] = min(dist[k][Pn.e],Pn.w);
Q.push(Pn);
}
}
}
}
void Init()
{
memset(vis,false,sizeof(vis));
for(int i=0; i<=n; i++)
{
G[0][i].clear();
G[1][i].clear();
dist[0][i] = dist[1][i] = INF;
}
} int Slove()
{
int Max = 0;
Dijkstra(X,n,0);
Dijkstra(X,n,1);
for(int i=1; i<=n; i++)
{
Max = max(dist[0][i]+ dist[1][i], Max);
}
return Max;
}
int main()
{
Edge P;
while(scanf("%d%d%d",&n,&m,&X) != EOF)
{
Init();
for(int i=0; i<m; i++)
{
int a, b, c;
scanf("%d%d%d",&a,&b,&c);
P.e = b, P.w = c;
G[0][a].push_back(P);
P.e = a;
G[1][b].push_back(P);
}
int ans = Slove(); cout << ans << endl;
}
return 0;
}

  

POJ 3268 Silver Cow Party ( Dijkstra )的更多相关文章

  1. POJ 3268 Silver Cow Party (Dijkstra)

    Silver Cow Party Time Limit: 2000MS   Memory Limit: 65536K Total Submissions:28457   Accepted: 12928 ...

  2. POJ 3268 Silver Cow Party (最短路径)

    POJ 3268 Silver Cow Party (最短路径) Description One cow from each of N farms (1 ≤ N ≤ 1000) convenientl ...

  3. POJ 3268 Silver Cow Party(Dijkstra算法求解来回最短路问题)

    题目链接: https://vjudge.net/problem/POJ-3268 One cow from each of N farms (1 ≤ N ≤ 1000) conveniently n ...

  4. POJ 3268 Silver Cow Party (双向dijkstra)

    题目链接:http://poj.org/problem?id=3268 Silver Cow Party Time Limit: 2000MS   Memory Limit: 65536K Total ...

  5. POJ 3268 Silver Cow Party (最短路dijkstra)

    Silver Cow Party 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/D Description One cow fr ...

  6. poj 3268 Silver Cow Party(最短路)

    Silver Cow Party Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 17017   Accepted: 7767 ...

  7. POJ 3268 Silver Cow Party(最短路&Dijkstra)题解

    题意:有n个地点,有m条路,问从所有点走到指定点x再走回去的最短路中的最长路径 思路:用Floyd超时的,这里用的Dijkstra. Dijkstra感觉和Prim和Kruskal的思路很像啊.我们把 ...

  8. poj 3268 Silver Cow Party(最短路,正反两次,这个模版好)

    题目 Dijkstra,正反两次最短路,求两次和最大的. #define _CRT_SECURE_NO_WARNINGS //这是找出最短路加最短路中最长的来回程 //也就是正反两次最短路相加找最大的 ...

  9. POJ 3268 Silver Cow Party(dij+邻接矩阵)

    ( ̄▽ ̄)" #include<iostream> #include<cstdio> #include<algorithm> #include<cs ...

随机推荐

  1. 动态规划晋级——POJ 3254 Corn Fields【状压DP】

    转载请注明出处:http://blog.csdn.net/a1dark 分析:刚开始学状压DP比较困难.多看看就发现其实也没有想象中那么难.这道题由于列数较小.所以将行压缩成二进制来看.首先处理第一行 ...

  2. Win7下Qt5.2中使用OpenGL的glu函数库无法使用的解决方案

          最近在Window7使用Qt5.2学习OpenGL时,出现了以OpenGL中glu开头的函数库无法使用的错误,例如: 'gluPerspective'  was not declared ...

  3. [转] doxygen使用总结

    doxygen [功能] 为许多种语言编写的程序生成文档的工具. [举例] *生成一个模板配置文件,模板文件中有详细的注释: $doxgen -g test 这样,会生成一个test文件,1500多行 ...

  4. 一些css小用法总结(持续更新~)

    1.用:before和:after实现小尖角效果 <div class="div"></div> .div{ background: #fff; borde ...

  5. Android模拟器访问本地的localhost失败及解决方案

    在开发手机网站是,使用Android模拟器测试,在手机浏览器中输入localhost访问本地服务器失败! 原因: 在Android系统中localhost就是127.0.0.1 在Windows系统中 ...

  6. 新建android系统服务

    一.Android系统服务 Android提供了很多系统服务:如ActivityManger,PowerManger,WindowManger,WifiManger等等. 这些服务都是系统启动开始就一 ...

  7. JQuery中根据属性或属性值获得元素

    根据属性获得元素 1.比如要获取页面p标签中属性有id的元素 $("p[id]").css("color","red"); 根据属性值获得元 ...

  8. BOM和DOM详解

    DOM介绍 D(文档)可以理解为整个Web加载的网页文档,O(对象)可以理解为类似window对象只来的东西,可以调用属性和方法,这里我们说的是document对象,M(模型)可以理解为网页文档的树形 ...

  9. Sql Server使用技巧

    1.修改表的字段时,提示不能更改: 工具>选项>设计器>取消 阻止保存要求重新创建表的更改 2.更改选择多少行,编辑多少行: 工具>选项>Sql Server对象资源管理 ...

  10. Android学习----五大布局

    1.LinearLayout 线性布局 android:orientation="horizontal" 制定线性布局的排列方式 水平 horizontal 垂直 vertical ...