您的位置:首页 > 其它

zoj 1082 Stockbroker Grapevine(最短路)

2015-05-09 16:51 337 查看
题目地址

题目大意:给出到达点与点之间的所需的时间,求出整个图中从哪个点出发使得到达最后一个点的时间最短,输出该点和最短时间

解题思路:最短路裸题,依次扫描每个点出发是否满足,再求出最短时间的点及最短时间

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <queue>
#include <string>
#include <map>
#include <stack>
#include <list>

using namespace std;

const int maxn = 100+10;
const int INF = 0xffffff;
int dis[maxn][maxn];
int num[maxn]; //记录点的个数及每个点对应的实际数

void warshall_floyd()
{
for(int k = 1; k <= maxn; k++)
{
for(int i = 1; i <= maxn; i++)
{
for(int j = 1; j <= maxn; j++)
{
dis[i][j] = min(dis[i][j],dis[i][k]+dis[k][j]);
}
}
}
}

int main()
{
int t,n,x;
while(scanf("%d",&t) != EOF && t)
{
for(int i = 0; i <= maxn; i++)
{
for(int j = 0; j <= maxn; j++)
{
if(i == j)
dis[i][j] = 0;
else
dis[i][j] = INF;
}
}
int cnt = 0;//点的个数
for(int i = 1; i <= t; i++)
{
scanf("%d",&n);
num[++cnt] = i;
for(int j = 1; j <= n; j++)
{
scanf("%d%d",&num[++cnt],&x);
dis[i][num[cnt]] = x;
}
}
warshall_floyd();
int Min;
int beg,time;
time = INF;
for(int i = 1; i <= t; i++)
{
int flag = 0; //标记每个点是否可作为出发点
Min = 0;
for(int j = 1; j <= cnt; j++)
{
Min = max(Min,dis[i][num[j]]);
if(dis[i][num[j]] == INF)
{
flag = 1;
Min = time;
continue;
}
}
if(!flag)
{
if(time > Min)
{
beg = i;
time = Min;
}
}
}
printf("%d %d\n",beg,time);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: