您的位置:首页 > 其它

UVALive - 5854 最短路

2012-05-03 22:23 405 查看
求出加油站两两之间的最短路,判断下即可

#include<iostream>
#include<cstring>
#include <cstdio>
#include<string>
#include<queue>
#include<vector>
#include<map>
#include <set>
#include<ctime>
#include<cmath>
#include <cstdlib>
#include<algorithm>
#include <iomanip>
using namespace std;

const int N = 10000;
const int INF = ((1<<30)-1);
int oil
;
char str1[100],str2[100];

int dis
,q
,n;
bool vis
;
void spfa(int s,vector< pair<int,int> > list
){
for(int i=0;i<N;i++) dis[i]=INF;
memset(vis,0,sizeof(vis));
int head=0,tail=0;
q[tail++]=s; dis[s]=0,vis[s]=true;
while(head!=tail){
int u=q[head];
for(int i=0;i<list[u].size();i++){
int v=list[u][i].first,w=list[u][i].second;
if(dis[v]>dis[u]+w){
dis[v]=dis[u]+w;
if(!vis[v]){
vis[v]=true;
q[tail++]=v;
if(tail==N-10) tail=0;
}
}
}
vis[u]=false; head++;
if(head==N-10) head=0;
}
}

vector< pair<int,int> > G
,g
;

int main(){
int n,m,k;
while(scanf("%d%d%d",&n,&m,&k)!=EOF){
k=k*10;
for(int i=0;i<=2*n;i++) G[i].clear();
for(int i=0;i<=2*n;i++) g[i].clear();
if(!n&&!m&&!k) return 0;
map<string,int> mpp;
int src=1,des=2,cnt=3;
scanf("%s%s",str1,str2);
mpp[str1]=src; mpp[str2]=des;
for(int i=0;i<n;i++){
int u,v,w;
scanf("%s%s%d",str1,str2,&w);
if(w>k) continue;
if(!mpp[str1]) mpp[str1]=cnt++;
if(!mpp[str2]) mpp[str2]=cnt++;
u=mpp[str1],v=mpp[str2];
G[u].push_back(make_pair(v,w));
G[v].push_back(make_pair(u,w));
}
int tail=0;
for(int i=0;i<m;i++){
scanf("%s",str1);
oil[tail++]=mpp[str1];
}
oil[tail++]=src; oil[tail++]=des;
for(int i=0;i<tail;i++){
int u=oil[i];
spfa(u,G);
for(int j=0;j<i;j++){
int v=oil[j];
if(dis[v]>k) {
g[u].push_back(make_pair(v,INF));
g[v].push_back(make_pair(u,INF));
}
else{
g[u].push_back(make_pair(v,dis[v]));
g[v].push_back(make_pair(u,dis[v]));
}
}
}
spfa(src,g);
int ans=dis[des];
if(ans>=INF||ans==-1) printf("-1\n");
else printf("%d\n",ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: