USACO 2.4.4 Bessie Come Home

带权边的dijkstra

View Code
  1 /*
  2 ID: xjtuacm1
  3 PROG: comehome
  4 LANG: C++
  5 */
  6 #include<iostream>
  7 #include<stack>
  8 #include<cstring>
  9 #include<cstdio>
 10 #include<queue>
 11 #include<algorithm>
 12 #include<set>
 13 #include<map>
 14 using namespace std;
 15 const int INF = 0x3f3f3f3f;
 16 const int M = 10000;
 17 const int N = 52;
 18 
 19 // Graph structure
 20 int n;
 21 int to[M], nxt[M], head[N];
 22 int w[M];
 23 bool vis[N];
 24 int e;
 25 int dist[N]; // Distance array
 26 struct cmp
 27 {
 28     bool operator() (int a, int b)
 29     {
 30         return dist[a] > dist[b];
 31     }
 32 };
 33 
 34 void init()
 35 {
 36     memset(vis, false, sizeof(vis));
 37     memset(head, -1, sizeof(head));
 38     e = 0;
 39 }
 40 void addEdge(int u, int v, int c)
 41 {
 42     to[e] = v;
 43     nxt[e] = head[u];
 44     w[e] = c;
 45     head[u] = e++;
 46 }
 47 
 48 void addBiEdge(int u, int v, int c)
 49 {
 50     addEdge(u, v, c);
 51     addEdge(v, u, c);
 52 }
 53 
 54 void dijkstra(int src)
 55 {
 56     // Reset distance array
 57     memset(vis, false, sizeof(vis));
 58     for(int i = 0; i!= n; i++)
 59         dist[i] = INF;
 60 
 61     priority_queue<int, vector<int>, cmp> que;
 62     vis[src] = true;
 63     dist[src] = 0;
 64     que.push(src);
 65     int pnt = src;
 66     for(int i = 1; i!=n; i++)
 67     {
 68         for(int j = head[pnt]; j!= -1; j = nxt[j])
 69         {
 70             int v = to[j];
 71             if(!vis[v] && dist[pnt] + w[j] < dist[v])
 72             {
 73                 dist[v] = dist[pnt] + w[j];
 74                 que.push(v);
 75             }
 76         }
 77         while(!que.empty() && vis[que.top()])
 78             que.pop();
 79         if(que.empty())
 80             break;
 81 
 82         pnt = que.top(); que.pop();
 83         vis[pnt] = true;
 84     }
 85 }
 86 
 87 set<char> cows;
 88 int r[N];
 89 bool indirectCmp(int a, int b)
 90 {
 91     return dist[a] < dist[b];
 92 }
 93 
 94 int toIdx(char ch)
 95 {
 96     if(ch != tolower(ch))
 97         return ch - 'A';
 98     else
 99         return ch - 'a' + 26;
100 }
101 char toChar(int idx)
102 {
103     if(idx < 26)
104         return idx + 'A';
105     else
106         return idx - 26 + 'a';
107 }
108 
109 int main(int argc, char *argv[])
110 {
111     freopen("comehome.in", "r", stdin);
112 #ifndef USACO
113     freopen("comehome.out", "w", stdout);
114 #endif // USACO
115 
116     int p;
117     scanf("%d\n", &p);
118 
119     n = N;
120     init();
121 
122     while(p--)
123     {
124         char f, t;
125         int c;
126         scanf("%c %c %d\n", &f, &t, &c);
127         if(f == t)
128             continue;
129 
130         bool flag = false;
131         for(int edge = head[toIdx(f)]; edge != -1; edge = nxt[edge])
132             if(to[edge] == (toIdx(t)))
133         {
134             w[edge] = min(w[edge], c);
135             flag = true;
136             break;
137         }
138         for(int edge = head[toIdx(t)]; edge != -1; edge = nxt[edge])
139             if(to[edge] == (toIdx(f)))
140         {
141             w[edge] = min(w[edge], c);
142             flag = true;
143             break;
144         }
145         if(flag)
146             continue;
147 
148         addBiEdge(toIdx(f), toIdx(t), c);
149     }
150 
151     dijkstra(toIdx('Z'));
152 
153     for(int i = 0; i!= n; i++)
154         r[i] = i;
155 
156     sort(r, r+n, indirectCmp);
157     for(int i = 1; i!= n; i++)
158     {
159         if(r[i] < 26)
160         {
161             printf("%c %d\n", toChar(r[i]), dist[r[i]]);
162             break;
163         }
164     }
165 
166     return 0;
167 }

 

转载于:https://www.cnblogs.com/tech-cabin/archive/2013/02/15/2912924.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值