链接:https://vjudge.net/problem/POJ-3268
题意:
1-N个农村要在X位置举办Party。求N个农村过去个回来的最大值。
给一个带权有向图,N个结点,M条路径。和点X。
思路:
第一次用Floyd算法O(N^3)超时了。
然后用两个二维数组,记录原数组和原数组的反方向。
例如,原数组Map1[x][1]记录的是x->1即从x回来的路程,Map2[x][1]记录的是1->x过去的路程。
代码:
#include <iostream>
#include <memory.h>
using namespace std;
const int MAXN = 1000+10;
const int INF = 99999999;
int Map1[MAXN][MAXN];//回来
int Map2[MAXN][MAXN];//过去
int Dis1[MAXN];
int Dis2[MAXN];
int vis[MAXN];
int n,m,x;
void Dijkstra(int Map[MAXN][MAXN],int Dis[MAXN])
{
memset(vis,0, sizeof(vis));
for (int i = 1;i <= n;i++)
Dis[i] = Map[x][i];
vis[x] = 1;
for (int i = 1;i <= n;i++)
{
int w,small = INF;
for (int j = 1;j <= n;j++)
{
if (vis[j] == 0)
{
if (Dis[j] < small)
{
small = Dis[j];
w = j;
}
}
}
vis[w] = 1;
for (int j = 1;j <= n;j++)
{
if (vis[j] == 0)
{
Dis[j] = min(Dis[j],Dis[w]+Map[w][j]);
}
}
}
}
int main()
{
int l,r,v;
scanf("%d%d%d",&n,&m,&x);
for (int i = 1;i<=n;i++)
for (int j = 1;j<=n;j++)
if (i == j)
Map2[i][j] = Map1[i][j] = 0;
else
Map2[i][j] = Map1[i][j] = INF;
for (int i = 0;i < m;i++)
{
scanf("%d%d%d",&l,&r,&v);
Map1[l][r] = v;
Map2[r][l] = v;
}
int sum = 0;
Dijkstra(Map1,Dis1);
Dijkstra(Map2,Dis2);
for (int i = 1;i<=n;i++)
sum = max(sum,Dis1[i]+Dis2[i]);
printf("%d\n",sum);
return 0;
}