链接: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 ",sum); return 0; }