您的位置:首页 > 其它

LightOJ-1002-Country Roads [最短路][Dijkstra]

2017-08-27 20:03 429 查看
题目传送门

题意:给定无向图,求一个城市t到其他城市的最低成本,成本的定义为路径中的最大消费。

思路:这个题跟POJ-2253-Frogger类似,可以用Dijkstra算法变形来写。也可以用kruskal来写。

#include <bits/stdc++.h>

using namespace std;

int n, m;
int mp[550][550];
const int INF = 0x3f3f3f3f;
void Dij(int x)
{
int dis[550];
bool vis[550];
memset(dis, INF, sizeof(dis));
memset(vis, false, sizeof(vis));
for (int i = 0; i < n; i++)
dis[i] = mp[x][i];
vis[x] = true;
dis[x] = 0;
for (int i = 0; i < n; i++)
{
int mi = INF;
int f = -1;
for (int j = 0; j < n; j++)
{
if (!vis[j] && dis[j] < mi)
{
mi = dis[j];
f = j;
}
}
if (f==-1)
break;
vis[f] = 1;
for (int j = 0; j < n; j++)
{
if (!vis[j] && dis[j] > max(dis[f],mp[f][j]))
{
dis[j] = max(dis[f], mp[f][j]);
}
}
}
for (int i = 0; i < n; i++)
{
if (dis[i]<INF)
printf("%d\n",dis[i]);
else
printf("Impossible\n");
}
return ;
}
int main(void)
{
int T, cas = 1;
scanf("%d", &T);
while (T--)
{
memset(mp, INF, sizeof(mp));
scanf("%d %d", &n, &m);
while (m--)
{
int x, y, s;
scanf("%d %d %d", &x, &y, &s);
if (mp[x][y] >= s)
mp[x][y] = mp[y][x] = s;
}
int p;
scanf("%d", &p);
printf("Case %d:\n",cas++);
Dij(p);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: