Morass

Babel

Mar 24th, 2016
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.81 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define PB push_back
  4. #define ZERO (1e-10)
  5. #define INF (1<<29)
  6. #define CL(A,I) (memset(A,I,sizeof(A)))
  7. #define DEB printf("DEB!\n");
  8. #define D(X) cout<<"  "<<#X": "<<X<<endl;
  9. #define EQ(A,B) (A+ZERO>B&&A-ZERO<B)
  10. typedef long long ll;
  11. typedef long double ld;
  12. typedef pair<ll,ll> pll;
  13. typedef vector<int> vi;
  14. typedef pair<int,int> ii;
  15. typedef vector<ii> vii;
  16. #define IN(n) int n;scanf("%d",&n);
  17. #define FOR(i, m, n) for (int i(m); i < n; i++)
  18. #define REP(i, n) FOR(i, 0, n)
  19. #define F(n) REP(i, n)
  20. #define FF(n) REP(j, n)
  21. #define FT(m, n) FOR(k, m, n)
  22. #define aa first
  23. #define bb second
  24. void ga(int N,int *A){F(N)scanf("%d",A+i);}
  25. #define MX (5000)
  26. int ct;
  27. string R[MX];
  28. unordered_map<string,int> t;
  29. int gt(string s){
  30.     auto i(t.find(s));
  31.     if(i==t.end())return R[ct]=s,t[s]=ct++;
  32.     return i->second;
  33. }
  34. #define CLR (ct=0,t.clear())
  35. char s[MX],r[MX],p[MX];
  36. struct EG{int t,v,c;};
  37. vector<EG> g[MX];
  38. int N,f,T,a,b,c;
  39. //DJ
  40. unordered_set<int>cn[MX];
  41. struct eg{
  42.     int v,t,b;
  43.     bool operator<(const eg&r)const{return v>r.v;}
  44. };
  45. int dj(int f,int t){
  46.     F(ct)cn[i].clear();
  47.     priority_queue<eg> q;
  48.     q.push({0,f,0}),cn[f].insert(0);
  49.     while(!q.empty()){
  50.         int a(q.top().t),w(q.top().v),b(q.top().b);
  51.         if(a==t)return w;
  52.         cn[a].insert(b);
  53.         for(auto&h:g[a])if(!(b&1<<h.c))q.push({w+h.v,h.t,1<<h.c});
  54.         while(!q.empty()&&cn[q.top().t].count(q.top().b))q.pop();
  55.     }
  56.     return -1;
  57. }
  58. int main(void){
  59.     while(scanf("%d",&N),N){
  60.         CLR,scanf("%s%s",s,r),f=gt(s),T=gt(r);
  61.         F(N)scanf("%s%s%s",s,r,p),a=gt(s),b=gt(r),g[a].PB({b,c=strlen(p),*p}),g[b].PB({a,c,*p});
  62.         a=dj(f,T);
  63.         if(~a)printf("%d\n",a);
  64.         else printf("impossivel\n");
  65.         F(ct)g[i].clear();
  66.     }
  67.     return 0;
  68. }
Advertisement
Add Comment
Please, Sign In to add comment