damihenrique

Untitled

Feb 21st, 2015
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.29 KB | None | 0 0
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <stdio.h>
  4. #include <cstring>
  5. #include <vector>
  6. #include <algorithm>
  7. #include <utility>
  8. #include <queue>
  9. #include <map>
  10. #include <stack>
  11. #include <cmath>
  12. #include <set>
  13.  
  14. #define INF 99999999
  15. #define rep(i, a, b) for (int i = int(a); i < int(b); i++)
  16. #define TRvii(c, it) for (vii::iterator it = (c).begin(); it != (c).end(); it++)
  17. #define tr(it, s)  for ( typeof ( s.begin( ) ) it=s.begin( ); it!=s.end( ); it++ )
  18. #define pb push_back
  19. #define clr(a) memset((a),0,sizeof(a))
  20. #define pi 3.1415926535897932384626433832795028841971
  21.  
  22. using namespace std;
  23.  
  24. typedef long long ll;
  25. typedef pair < int, int >  ii;
  26. typedef vector < int >  vi;
  27. typedef vector < ii >  vii;
  28.  
  29.  
  30. map<string, int> mp;
  31. vector<pair<int, string> > adj[4099];
  32. vector<pair<int, int> > list[104444];
  33.  
  34. int calc_p(char a){
  35.        
  36.      return a-'a' + 1;
  37. }
  38.  
  39. int calc_v(int a, int d){
  40.    
  41.      return 26*a + d;    
  42. }
  43.  
  44. int dijkstra (int s, int fim)  // inicio  -  destino
  45. {
  46.      vector<int> dist(104009+1, INF);
  47.      dist[s] = 0;
  48.      
  49.  
  50.      priority_queue<ii> pq;
  51.      pq.push(ii(0, s));
  52.  
  53.      while (!pq.empty()) {
  54.  
  55.           ii top = pq.top(); pq.pop();
  56.           int d = -top.first, u = top.second;
  57.  
  58.           if (d == dist[u]){
  59.                for(vector<pair<int,int> > :: iterator it = list[u].begin(); it != list[u].end(); it++){
  60.               // tr (it, list[u]) {
  61.                     int v = it->first, weight_u_v = it->second;
  62.                     if (dist[u] + weight_u_v < dist[v]) {
  63.                          dist[v] = dist[u] + weight_u_v;
  64.                          pq.push(ii(-dist[v], v));
  65.                     }
  66.                }
  67.           }
  68.            
  69.           if(u == fim) return dist[fim];
  70.      }
  71.        
  72.      return INF;
  73. }
  74.  
  75.  
  76. int main(){
  77.    
  78.      char ini[55], fim[55], x[55], y[55], c[55];
  79.      int n;
  80.            
  81.      while(scanf("%d",&n) && n){
  82.            
  83.           getchar();
  84.           mp.clear();
  85.           scanf("%s%s",ini,fim);
  86.           int qt = 1;
  87.            
  88.           rep(i,0,n){
  89.                  
  90.                scanf("%s%s%s",&x,&y,&c);
  91.                if(!mp[x]) mp[x] = qt++;
  92.                if(!mp[y]) mp[y] = qt++;
  93.                  
  94.                adj[mp[x]].pb(make_pair(mp[y],c));
  95.                adj[mp[y]].pb(make_pair(mp[x],c));
  96.           }
  97.            
  98.           if(!mp[ini] || !mp[fim])
  99.                printf("impossivel\n");
  100.           else{
  101.            
  102.                rep(i,1,qt){
  103.                      
  104.                       int tam = adj[i].size();  
  105.                       rep(j,0,tam){        
  106.                                
  107.                               int pos = calc_p(adj[i][j].second[0]); // pos da letra ( 1(a) ... 26(z) )
  108.                               int vtx = calc_v(i-1, pos); // id unico (vertice)  
  109.                               int vty = calc_v(adj[i][j].first-1, pos);  // mesma letra (n conecta)
  110.                               int oky = vty - (adj[i][j].second[0] - 'a');  // comeco do intervalo da ID            
  111.  
  112.                               int custo = adj[i][j].second.size();
  113.                                
  114.                               rep(k,oky,oky+26){  // itero todo intervalo do vertice, (a at? z)
  115.        
  116.                                    if(k != vty)   //  conecto se for diferente da primeira letra atual
  117.                                         list[vtx].pb(ii(k,custo));
  118.                               }
  119.                       }  
  120.                }  
  121.                  
  122.                int vini = (mp[ini]-1) * 26  +1;
  123.                int vfim = (mp[fim]-1) * 26  +1;
  124.                  
  125.                rep(i,0,26)
  126.                     list[0].pb(ii(vini+i,0));
  127.                      
  128.                rep(i,0,26)
  129.                     list[vfim+i].pb(ii(26*qt+30,0));
  130.        
  131.                int ans = dijkstra(0,26*qt+30);
  132.                  
  133.                if(ans == INF)
  134.                     printf("impossivel\n");
  135.                else
  136.                     printf("%d\n",ans);
  137.              
  138.           }
  139.            
  140.           rep(i,0,qt)
  141.                adj[i].clear();
  142.                  
  143.           int limit = qt*26+30;
  144.            
  145.           rep(i,0,limit)
  146.                list[i].clear();
  147.            
  148.      }
  149.          
  150.      return 0;
  151. }
Advertisement
Add Comment
Please, Sign In to add comment