hdu2112


#include<cstdlib>
#include<iostream>
#include<string>
#include<queue>
#include<vector>
#include<map>
const int INF = 1<<26;
using namespace std;

typedef struct node
{
 int next,d;
 node(){}
 node(int a,int b){next=a;d=b;}
 bool operator<(const node &a) const{
  if(d==a.d)return next<a.next;
  else return d>a.d;
 }
}node;

int n,m,dis[152];
vector<node>eg[152];

void Dijkstra(int s)
{
 int i;
 for(i=0;i<n;i++)dis[i]=INF;
 priority_queue<node>q;
 dis[s]=0;
 q.push(node(s,dis[s]));
 while(!q.empty())
 {
  node x=q.top(); q.pop();
  for(i=0;i<eg[x.next].size;i++)
  {
   if(dis[eg[x.next][i].next]>x.d+eg[x.next][i].d)
   {
    dis[eg[x.next][i].next]=x.d+eg[x.next][i].d;
    q.push(node(eg[x.next][i].next,dis[eg[x.next][i].next]));
   }
  }
 }
}


int main()
{
 int i,j,id,d;

 char start[32],end[32],ch1[32],ch2[32];
 while(scanf("%d",&n)&&n!=-1)
 {
  map<string,int> addr;
  for(i=0;i<n;i++) eg[i].clear();
  id=0;

  scanf("%s %s",start,end);
  if(addr[start]==0) addr[start]=++id;
  if(addr[end]==0) addr[end]=++id;
  for(i=0;i<n;i++)
  {
   scanf("%s %s %d",ch1,ch2,d);
   if(addr[ch1]==0) addr[ch1]=++id;
   if(addr[ch2]==0) addr[ch2]=++id;
   eg[addr[ch1]].push_back(node(addr[ch2],d));
   eg[addr[ch2]].push_back(node(addr[ch1],d));
  }
  Dijkstra(addr[start]);
  printf("%d\n",dis[addr[end]]);
  scanf("%s",ch1);
  printf("%d\n",addr[ch1]);
  scanf("%s",ch2);
  printf("%d\n",addr[ch2]);
  scanf("%s",ch1);
  printf("%d\n",addr[ch1]);
  scanf("%s",ch2);
  printf("%d\n",addr[ch2]);


 }
 return 0;
}

 

你可能感兴趣的:(include)