1460 Heavy Cargo 最短路径 Dijkstra 变形
2012-08-15 15:02
176 查看
题意:有一个卡车公司能生产非常大的卡车,卡车打的足以装下任何大小和重量的货物;现在 要用这卡车 运送货物, 从城市A运送到城市B,城市与城市之间的道路构成一个 无向图, 道路有最大的承受重量,请选择 运送的路径 输出 能卡车 最多可以装载多少货物;
思路:应该是网络流的题目,不过 用Dijkstra也可以解, 利用Dijkstra算法 求出每条路径的最小装载,然后在这些最小装载中 找到最大的一个;
[cpp] view
plaincopyprint?
#include <iostream>
using namespace std;
char name[201][50];
int w[201][201],dis[201];
int sum,n,r;
int getnum(char t[])
{
for(int i=0; i<=sum; i++)
if(!strcmp(name[i], t))
return i;
sum++;
strcpy(name[sum], t);
return sum;
}
int Dijkstra(int s, int e)
{
int i,j,t,minw;
bool flag[201]={0};
for(i=0; i<n; i++)
dis[i] = w[s][i];
dis[s]=0; flag[s]=true;
for(i=0; i<n; i++)
{
minw = dis[e]; t = s;
for(j=0; j<n; j++)
if(dis[j]>minw && !flag[j])
{
t = j;
minw = dis[j];
}
if(flag[t]) return dis[e];
flag[t] = true;
for(j=0; j<n; j++)
if(!flag[j] && w[t][j]>-1)
{
minw = dis[t]>w[t][j]?w[t][j]:dis[t];
dis[j] = dis[j]<minw?minw:dis[j];
}
}
return dis[e];
}
int main()
{
int i,weight,s,e,Case=0;
char a[50],b[50];
while(scanf("%d %d%*c", &n, &r),n+r)
{
memset(w,-1,sizeof(w));
memset(name,'\0',sizeof(name));
sum=-1;
for(i=0; i<r; i++)
{
scanf("%s %s %d", &a, &b, &weight);
s = getnum(a); e = getnum(b);
w[s][e]=w[e][s]=weight;
}
scanf("%s %s", &a, &b);
s = getnum(a); e = getnum(b);
printf("Scenario #%d\n%d tons\n\n",++Case, Dijkstra(s,e));
}
return 0;
}
思路:应该是网络流的题目,不过 用Dijkstra也可以解, 利用Dijkstra算法 求出每条路径的最小装载,然后在这些最小装载中 找到最大的一个;
[cpp] view
plaincopyprint?
#include <iostream>
using namespace std;
char name[201][50];
int w[201][201],dis[201];
int sum,n,r;
int getnum(char t[])
{
for(int i=0; i<=sum; i++)
if(!strcmp(name[i], t))
return i;
sum++;
strcpy(name[sum], t);
return sum;
}
int Dijkstra(int s, int e)
{
int i,j,t,minw;
bool flag[201]={0};
for(i=0; i<n; i++)
dis[i] = w[s][i];
dis[s]=0; flag[s]=true;
for(i=0; i<n; i++)
{
minw = dis[e]; t = s;
for(j=0; j<n; j++)
if(dis[j]>minw && !flag[j])
{
t = j;
minw = dis[j];
}
if(flag[t]) return dis[e];
flag[t] = true;
for(j=0; j<n; j++)
if(!flag[j] && w[t][j]>-1)
{
minw = dis[t]>w[t][j]?w[t][j]:dis[t];
dis[j] = dis[j]<minw?minw:dis[j];
}
}
return dis[e];
}
int main()
{
int i,weight,s,e,Case=0;
char a[50],b[50];
while(scanf("%d %d%*c", &n, &r),n+r)
{
memset(w,-1,sizeof(w));
memset(name,'\0',sizeof(name));
sum=-1;
for(i=0; i<r; i++)
{
scanf("%s %s %d", &a, &b, &weight);
s = getnum(a); e = getnum(b);
w[s][e]=w[e][s]=weight;
}
scanf("%s %s", &a, &b);
s = getnum(a); e = getnum(b);
printf("Scenario #%d\n%d tons\n\n",++Case, Dijkstra(s,e));
}
return 0;
}
相关文章推荐
- HDU1596 find the safest road---(最短路径dijkstra,#变形#)
- POJ 3255 Roadblocks (Dijkstra求最短路径的变形)(Dijkstra求次短路径)
- POJ 3790 最短路径问题(Dijkstra变形——最短路径双重最小权值)
- L2-001. 紧急救援 (Dijkstra最短路径变形)
- NYOJ 1248 海岛争霸(Dijkstra变形——最短路径最大权值)
- 杭电 hdu 3790 最短路径问题 (最短路径 + Dijkstra)稍微的变形
- 最短路径(2)--poj1797(Dijkstra变形题)
- POJ 2253 Frogger(最短路径Dijkstra的变形)
- 最短路径(3)--poj2253(Dijkstra变形题)
- 最短路径(4)--poj3268(dijkstra单源最短路径变形)
- POJ 2253 Frogger(Dijkstra变形——最短路径最大权值)
- POJ 3790 最短路径问题(Dijkstra变形——最短路径双重最小权值)
- [转]最短路径算法—Dijkstra(迪杰斯特拉)算法分析与实现
- 几个最短路径算法Floyd、Dijkstra、Bellman-Ford、SPFA的比较
- SDUT 2143 图结构练习——最短路径(Dijkstra 单源最短路径求解)
- Dijkstra算法求单源最短路径Java实现
- 数据结构与算法--单源最短路径算法之dijkstra
- 最短路径:(Dijkstra & Floyd)
- 【Python排序搜索基本算法】之Dijkstra最短路径算法(Dijkstra's Shortest-Path Algorithm)
- hdu4849(瞎扯+dijkstra求最短路径)