hdu2112 HDU Today

来源:互联网 发布:易语言ddos源码 编辑:程序博客网 时间:2024/05/10 21:55

map好像挺慢的

#include<iostream>#include<string>#include<cstdio>#include<map>#define INF 0x3f3f3f3fusing namespace std;int dis[155][155],cost[155];bool vis[155];map<string,int>list;void dijkstra(int s,int t,int len){int i,j,mini;int pos;for(i=1;i<=len;i++){vis[i]=0;cost[i]=dis[s][i];}vis[s]=1;cost[s]=0;for(i=1;i<=len-1;i++){mini=INF;pos=i;   //这一步纯粹是为了保险for(j=1;j<=len;j++)if(!vis[j]&&cost[j]<mini){mini=cost[j];pos=j;}if(mini>=INF||pos==t) break;   //出发点道目的地路径不存在或者已经找到最短路径时就没有必要再算下去了vis[pos]=1;for(j=1;j<=len;j++)if(!vis[j]&&cost[pos]+dis[pos][j]<cost[j])cost[j]=cost[pos]+dis[pos][j];}if(cost[t]>=INF)printf("-1\n");elseprintf("%d\n",cost[t]);}int main(){int n;string start,dest,from,to;int route;while(scanf("%d",&n)&&n!=-1){list.clear();memset(dis,0x3f,sizeof(dis));int len=1;cin>>start>>dest;while(n--){cin>>from>>to>>route;if(list.find(from)==list.end())list[from]=len++;if(list.find(to)==list.end())list[to]=len++;if(route<dis[list[from]][list[to]])   //去除万恶的重边dis[list[from]][list[to]]=dis[list[to]][list[from]]=route;   //路线是双向的,题目也没说清楚比较坑爹}if(list.find(start)==list.end()||list.find(dest)==list.end()){printf("-1\n"); continue;}dijkstra(list[start],list[dest],len-1);}return 0;}


原创粉丝点击