这个题目就是单向图,所有的 起点到终点终点到起点的最短路距离之和,求一个最大值。方法我是用的spfa 然后对于处理上,我是用的循环,可能这样跑的时间比较长,可以再做一个处理 用数组去保存下来那个最短路的信息也是可以的。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <map>
#include <queue>
#include <math.h>
#include <stack>
#include <utility>
#include <string>
#include <sstream>
#include <cstdlib>
#include <set>
#define LL long long
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = 1000 + 10;
int dir[4][2] = {{1,0},{0,1},{-1,0},{0,-1}};
struct edge
{
int to;
int cost;
edge(int a = 0,int b = 0)
{
to = a;
cost = b;
}
};
vector<edge> G[maxn];
int d[maxn];
int vis[maxn];
int sum[maxn];
int m,n,E;
void spfa(int s,int flag)
{
queue<int> que;
for(int i = 0; i <= n; i++)
{
d[i] = INF;
}
d[s] = 0;
que.push(s);
while(!que.empty())
{
int v = que.front();
que.pop();
for(int i = 0; i < G[v].size(); i++)
{
edge e = G[v][i];
if(d[e.to] > d[v] + e.cost)
{
d[e.to] = d[v] + e.cost;
que.push(e.to);
}
}
}
if(flag)
{
for(int i = 1; i <= n; i++)
{
sum[i] += d[i];
}
}
else
{
sum[s] += d[E];
}
}
int main()
{
memset(sum,0,sizeof(sum));
scanf("%d%d%d",&n,&m,&E);
for(int i = 0; i <= n; i++)
{
G[i].clear();
}
for(int i = 1; i <= m; i++)
{
int x,y,w;
scanf("%d%d%d",&x,&y,&w);
G[x].push_back(edge(y,w));
}
spfa(E,1);
for(int i = 1; i <= n; i++)
{
if(i == E)
continue;
spfa(i,0);
}
int max1 = -INF;
for(int i = 0; i <= n; i++)
{
max1 = max(max1,sum[i]);
}
printf("%d\n",max1);
return 0;
}