POJ 3268 Silver Cow Party ( Dijkstra )
题目大意:
有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 )的更多相关文章
- POJ 3268 Silver Cow Party (Dijkstra)
Silver Cow Party Time Limit: 2000MS Memory Limit: 65536K Total Submissions:28457 Accepted: 12928 ...
- POJ 3268 Silver Cow Party (最短路径)
POJ 3268 Silver Cow Party (最短路径) Description One cow from each of N farms (1 ≤ N ≤ 1000) convenientl ...
- POJ 3268 Silver Cow Party(Dijkstra算法求解来回最短路问题)
题目链接: https://vjudge.net/problem/POJ-3268 One cow from each of N farms (1 ≤ N ≤ 1000) conveniently n ...
- POJ 3268 Silver Cow Party (双向dijkstra)
题目链接:http://poj.org/problem?id=3268 Silver Cow Party Time Limit: 2000MS Memory Limit: 65536K Total ...
- POJ 3268 Silver Cow Party (最短路dijkstra)
Silver Cow Party 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/D Description One cow fr ...
- poj 3268 Silver Cow Party(最短路)
Silver Cow Party Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 17017 Accepted: 7767 ...
- POJ 3268 Silver Cow Party(最短路&Dijkstra)题解
题意:有n个地点,有m条路,问从所有点走到指定点x再走回去的最短路中的最长路径 思路:用Floyd超时的,这里用的Dijkstra. Dijkstra感觉和Prim和Kruskal的思路很像啊.我们把 ...
- poj 3268 Silver Cow Party(最短路,正反两次,这个模版好)
题目 Dijkstra,正反两次最短路,求两次和最大的. #define _CRT_SECURE_NO_WARNINGS //这是找出最短路加最短路中最长的来回程 //也就是正反两次最短路相加找最大的 ...
- POJ 3268 Silver Cow Party(dij+邻接矩阵)
( ̄▽ ̄)" #include<iostream> #include<cstdio> #include<algorithm> #include<cs ...
随机推荐
- Java基础知识强化之集合框架笔记11:Collection集合之迭代器的原理及源码解析
1. 迭代器为什么不定义成一个类,而是定义为一个接口 ? 答:假设迭代器定义的是一个类,这样我们就可以创建该类的对象,调用该类的方法来实现集合的遍历.但是呢? 我们想想,Java中提供了很多的集合类 ...
- Android WindowManager的使用
经常,我们看到在桌面上可移动的悬浮窗,这种场景还是很多的, 像流量统计,桌面歌词等,安全软件的清理小部件 这种小部件主要是通过 WindowManager ; WindowManager.Layout ...
- 关于Linux的缓存内存 Cache Memory详解<转>
转自 http://www.ha97.com/4337.html PS:前天有童鞋问我,为啥我的Linux系统没运行多少程序,显示的可用内存这么少?其实Linux与Win的内存管理不同,会尽量缓存内存 ...
- 大牛对ACM入门菜鸟的一些话
首先就是我为什么要写这么一篇日志.原因很简单,就是因为前几天有个想起步做ACM人很诚恳的问我该如何入门.其实就现在而言,我并不是很想和人再去讨论这样的话题,特别是当我发现我有很多的东西要学的时候,我实 ...
- javascript 实用函数
1.去除字符串空格 /*去左空格*/ function ltrim(s) { return s.replace(/^(\s*| *)/, ""); } /*去右空格*/ funct ...
- GIT学习(一)-->Git产生的历史原因
首先要说:Git是目前世界上最先进的分布式版本控制系统(没有之一). git的作者:Linus,林纳斯(下图就是,先膜拜一下,因为成就可不止这一点) 他是为何要写git的呢?话说 Linus虽然创建了 ...
- 关于电脑开机不出现桌面即不启动explorer.exe桌面程序--------正解
针对这个问题,一开始的思路是,把自己写的界面小程序(Win.exe)放在Windows启动文件夹中, 效果到是界面程序自启动了,但是还是先出现的桌面,然后才的启动的界面程序(Win.exe),并不是我 ...
- Apache下Worker模式MPM参数分析
我的worker.c配置如下:<IfModule mpm_worker_module> ServerLimit 32 ThreadLimit 128 StartServers ...
- 键盘数字对应的ASCII码(keycode码)
keycode 1 = 鼠标左键keycode 2 = 鼠标右键keycode 3 = Cancelkeycode 4 = 鼠标中键keycode 8 = BackSpace keycode 9 = ...
- wariging for you oh~