poj 动态规划之1125 Stockbroker Grapevine
题目链接:http://poj.org/problem?id=1125
这道题一看从本质上就是算最短路径,回顾一下,Dijkstra是算单源最短路径的,Floyd算法是利用三重循环计算所有点为起点的最短路径的。
一、Dijkstra算法
//Dijkstra
#include<cstdio>
#include<string>
#include<iostream>
#include<algorithm>
#include<memory.h>
#define INF 2000
using namespace std;
int a[105][105];
int Dijkstra(int start, int n)
{
int dis[105], i, j, value, index, ans;
bool mark[105];
memset(mark, 0, sizeof(mark));
for (i = 1; i <= n; i++)
dis[i] = a[start][i];
mark[start] = 1;
for (i = 1; i < n; i++)
{
index = start;
value = INF ;
for (j = 1; j <= n; j++)
if (!mark[j] && dis[j]<value)
{
value = dis[j];
index = j;
}
mark[index] = 1;
for (j = 1; j <= n; j++)
{
if (!mark[j] )
{
dis[j] = min(dis[j], dis[index] + a[index][j]);
}
}
}
ans = dis[1];
for (i = 2; i <= n; i++)
ans = max(ans, dis[i]);
return ans;
}
int main()
{
freopen("1.txt", "r", stdin);
int n, i, j, t, k, ans, idx, tmp;
while (scanf("%d", &n) && n != 0)
{
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
a[i][j] = INF;
for (i = 1; i <= n; i++)
{
scanf("%d", &k);
for (j = 1; j <= k; j++)
{
scanf("%d", &t);
scanf("%d", &a[i][t]);
}
}
for (i = 1; i <= n; i++)
a[i][i] = 0;
ans = INF;
k = 1;
for (i = 1; i <= n; i++)
{
j = Dijkstra(i, n);
if (j < ans)
{
ans = j;
k = i;
}
}
printf("%d %d\n", k, ans);
}
}
结果:140K 0MS
方法二、Floyd算法 典型的动态规划
#include<cstdio>
#include<string>
#include<iostream>
#include<algorithm>
#include<memory.h>
#define INF 1000000
using namespace std;
int a[105][105], dp[105];
int main()
{
//freopen("1.txt", "r", stdin);
int n, i, j, t, k, ans, idx, tmp;
while (scanf("%d", &n) && n != 0)
{
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
a[i][j] = INF;
for (i = 1; i <= n; i++)
a[i][i] = 0;
for (i = 1; i <= n; i++)
{
scanf("%d", &k);
for (j = 1; j <= k; j++)
{
scanf("%d", &t);
scanf("%d", &a[i][t]);
}
}
for (k = 1; k <= n;k++)
for (i = 1; i <= n;i++)
for (j = 1; j <= n; j++)
{
a[i][j] = min(a[i][j], a[i][k] + a[k][j]);
}
ans = INF;
k = 1;
memset(dp, 0, sizeof(dp));
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
if (i!=j)
dp[i] = max(dp[i], a[i][j]);
}
if (dp[i] < ans)
{
ans = dp[i];
k = i;
}
}
if (ans == INF)
printf("disjoint\n");
else
printf("%d %d\n", k, ans);
}
}
在写floyed算法的时候我发现一个问题,就是我用vs的时候声明int数组变量自动赋值为0,在用poj的时候必须要memset一下。