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; }
相关文章推荐
- POJ 2263 Heavy Cargo
- POJ 2263 Heavy Cargo 最短路dijkstra
- POJ 2263 Heavy Cargo(Dijkstra算法)
- poj2263 Heavy Cargo(dijstra 变形)
- POJ 2263 Heavy Cargo(图的遍历)
- POJ-2263 Heavy Cargo
- poj2263 zoj1952 Heavy Cargo(floyd||spfa)
- POJ 2263 Heavy Cargo
- POJ 2263 Heavy Cargo(二分+并查集)
- POJ:2263 Heavy Cargo
- poj 2263 Heavy Cargo
- poj 2263 Heavy Cargo 最短路 变形
- poj 2263 Heavy Cargo(最短路+floyd)
- POJ 2263 Heavy Cargo
- poj 2263 Heavy Cargo
- poj 2263 Heavy Cargo(最短路+floyd)
- (Relax dijkstra1.2)POJ 2263 Heavy Cargo(使用dijkstra来求解最大生成树问题)
- POJ 2263 Heavy Cargo
- poj 2263 Heavy Cargo(floyd)
- zoj 1952 && poj 2263 Heavy Cargo