您的位置:首页 > 编程语言 > Go语言

poj 2263 Heavy Cargo

2013-09-24 11:13 211 查看
很简单的一题最短路, 稍微有点特殊的便是, 进行松弛时, 是按照min(dis[k],map[i][k])的大小来进行的, 并且得判断i k 是否连通, 然后就是赤裸裸的迪杰斯特拉了。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<string>
using namespace std;
const int Maxn = 210;
const int inf = 0x3f3f3f3f;
int n, m, t, s, e;
string city[Maxn];
int map[Maxn][Maxn], dis[Maxn];
bool vis[Maxn];

int min(int a,int b)
{
return a>b?b:a;
}

void ini()
{
for(int i=1; i<=n; ++i)
for(int j=i; j<=n; ++j)
map[i][j] = map[j][i] = 0;
for(int i=1; i<=n; ++i)
{
dis[i] = 0;
vis[i] = false;
}
}

int judge(string s)
{
for(int i=1; i<t; ++i)
if(city[i] == s)
return i;
city[t] = s;
return t++;
}

void dij()
{
vis[s] = true;
for(int i=1; i<=n; ++i)
dis[i] = map[i][s];
dis[s] = inf;
int cou = n-1;
while(cou--)
{
int k, mi = 0;
for(int i=1; i<=n; ++i)
if(!vis[i] && dis[i]>mi)
{
k = i;
mi = dis[i];
}
if(k == e)
return;
vis[k] = true;
for(int i=1; i<=n; ++i)
if(!vis[i] && map[i][k] && dis[i]<min(dis[k],map[i][k]))
{
dis[i] = min(dis[k],map[i][k]);
}
}

}

int main(void)
{
int v = 0;
while(scanf("%d %d",&n,&m), n||m)
{
ini();
t = 1;
string a, b;
int val;
for(int i=1; i<=m; ++i)
{
cin>>a>>b>>val;
int tmp1 = judge(a);
int tmp2 = judge(b);
map[tmp1][tmp2] = map[tmp2][tmp1] = val;
}
cin>>a>>b;
s = judge(a);
e = judge(b);
dij();
printf("Scenario #%d\n",++v);
cout << dis[e] <<" tons"<< endl << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: