HDU2112 最短路入门题 spfa

来源:互联网 发布:什么是奥菲斯软件 编辑:程序博客网 时间:2024/05/20 06:50

无向图,给出起点和终点,求最短路,基础题,只不过点成了字符串罢了,可以用map把字符串转化为编号,就可以像普通的最短路那样求了。

#include<iostream>#include<algorithm>#include<queue>#include<vector>#include<cstring>#include<cstdio>#include<map> const int INF=0x3f3f3f3f;typedef long long LL;using namespace std;const int maxn=10055;struct Edge{int e;//终点 int w; //权值 Edge(int _e,int _w):e(_e),w(_w){}Edge(){}};vector<Edge> G[maxn];int N;int dist[maxn];int vis[maxn];map<string,int> mp;char S[100],T[100];void spfa(int v){memset(dist,INF,sizeof(dist));memset(vis,0,sizeof(vis));dist[v]=0;queue<int> q;q.push(v);vis[v]=1;while(!q.empty()){int s=q.front();q.pop();vis[s]=0;for(int i=0;i<G[s].size();i++){int e=G[s][i].e;if(dist[e]>dist[s]+G[s][i].w){dist[e]=dist[s]+G[s][i].w;if(!vis[e]){q.push(e);vis[e]=1;}}}} }int main(){//freopen("E:\\ACM\\test.txt","r",stdin);while(scanf("%d",&N)){if(N==-1) break;mp.clear();for(int i=0;i<maxn;i++) G[i].clear();scanf("%s%s",S,T);int s,e,w;int cnt=0;mp[S]=++cnt;if(mp[T]==0) mp[T]=++cnt; //注意起点和终点一样的情况 char s1[100],s2[100];for(int i=0;i<N;i++) {scanf("%s%s%d",s1,s2,&w);if(mp[s1]==0) mp[s1]=++cnt;if(mp[s2]==0) mp[s2]=++cnt;s=mp[s1];e=mp[s2];G[s].push_back(Edge(e,w));G[e].push_back(Edge(s,w));}s=mp[S];e=mp[T];spfa(s);if(dist[e]!=INF) printf("%d\n",dist[e]); else puts("-1");}return 0;}


 
原创粉丝点击