题目大意:有n个农场,m条路,并且在X号农场开party。现在在除了X号农场的其他农场,都有牛来X号农场开party,party结束以后就各回各家,当然,走的都是最短路。求这n - 1只牛中往返的最大的最短路。
水题
code:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include<cmath>
#include<cstdlib>
#include<map>
#include<string>
#include<vector>
#include<queue>
#include<functional>
#pragma warning(disable:4996)
//最大边的最小权值
using namespace std;
typedef long long ll;
const int INF = 999999999;
typedef pair<int, int> P;//第一个值表示最大权值
struct edge {
int to, cost;
};
int d[1001];
vector<edge>G[1005];
int vis[1005];
int n, m, x;
void dijkstra(int s)
{
for (int i = 1; i <= n; i++)
d[i] = INF;
d[s] = 0;
priority_queue<P,vector<P>,greater<P> >que;
que.push( P(0, s));
while (!que.empty())
{
P p = que.top();
que.pop();
int v = p.second;
if (d[v] < p.first)continue;
for (int i = 0; i<G[v].size(); i++)
{
edge e = G[v][i];
if (d[e.to] > p.first + e.cost)
{
d[e.to] = p.first + e.cost;
que.push(P(d[e.to], e.to));
}
}
}
}
int main()
{
scanf("%d%d%d",&n,&m,&x);
for (int i = 1; i <= n; i++)
G[i].clear();
for (int i = 1; i <= m; i++)
{
int a, b, c;
scanf("%d%d%d",&a,&b,&c);
edge e;
e.to = b, e.cost = c;
G[a].push_back(e);
}
int maxx = 0;
for (int i = 1; i <= n; i++)
{
dijkstra(i);
int sum = d[x];
dijkstra(x);
sum += d[i];
maxx = max(sum, maxx);
}
printf("%d\n", maxx);
}