Time Limit: 2000MS | Memory Limit: 30000K | |
Total Submissions: 8694 | Accepted: 3052 | |
Case Time Limit: 1000MS |
Description算法
Inputapp
Outputide
Sample Inputui
7 6 1 6 13 E 6 3 9 E 3 5 7 S 4 1 3 N 2 4 20 W 4 7 2 S 3 1 6 1 4 2 6
Sample Outputthis
13 3 36
Hintspa
Sourcerest
#include <stdio.h> #include <string.h> const int oo = 0x3f3f3f3f; const int maxE = 1000000; const int maxN = 100005; struct Edge{ int n, v, d, lca; }; Edge edge[maxE]; int p[maxN]; int Adj[maxN], l; Edge qedge[maxE]; int qAdj[maxN], ll; int vis[maxN]; int dis[maxN]; int ask[maxN]; int n, m, q; int min(int a, int b){ if(a > b) return b; return a; } int find(int x){ return p[x] == x ? x : (p[x] = find(p[x])); } void addedge(int u, int v, int d){ edge[l].v = v; edge[l].d = d; edge[l].n = Adj[u]; Adj[u] = l++; edge[l].v = u; edge[l].d = d; edge[l].n = Adj[v]; Adj[v] = l++; } void qaddedge(int u, int v){ qedge[ll].v = v; qedge[ll].n = qAdj[u]; qAdj[u] = ll++; qedge[ll].v = u; qedge[ll].n = qAdj[v]; qAdj[v] = ll++; } void init(){ for(int i = 0; i <= n; ++i) p[i] = i; memset(vis, 0, sizeof vis); memset(dis, oo, sizeof dis); memset(Adj, -1, sizeof Adj); memset(qAdj, -1, sizeof qAdj); l = 0; ll = 0; } int LCA(int u){ p[u] = u; vis[u] = 1; for(int i = Adj[u]; ~i; i = edge[i].n){ int v = edge[i].v; if(!vis[v]){ dis[v] = min(dis[v], dis[u] + edge[i].d); LCA(v); p[v] = u; } } for(int i = qAdj[u]; ~i; i = qedge[i].n){ int v = qedge[i].v; if(vis[v]){ qedge[i].lca = find(v); qedge[i ^ 1].lca = qedge[i].lca; qedge[i].d = dis[v] + dis[u] - 2 * dis[qedge[i].lca]; qedge[i ^ 1].d = qedge[i].d; } } return 0; } void work(){ int u, v, d; while(~scanf("%d%d", &n, &m)){ init(); for(int i = 0; i < m; ++i){ scanf("%d%d%d%*s", &u, &v, &d); addedge(u, v, d); } scanf("%d", &q); for(int i = 0; i < q; ++i){ scanf("%d%d", &u, &v); ask[i] = ll; qaddedge(u, v); } dis[u] = 0; LCA(u); for(int i = 0; i < q; ++i){ printf("%d\n", qedge[ask[i]].d); } } } int main(){ work(); return 0; }