1. 程式人生 > >貨車運輸——幾經波折,重打幾次,終於完全完成

貨車運輸——幾經波折,重打幾次,終於完全完成

sin 技術分享 class ++ node logs i++ push_back include

  大概也就是重打了十幾遍吧。

技術分享
 1 #include<algorithm>
 2 #include<iostream>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<string>
 6 #include<vector>
 7 #include<cstdio>
 8 #include<cmath>
 9 #include<map>
10 #include<set>
11 using namespace
std; 12 const int N=10086,M=50086,L=20,INF=0x7fffffff; 13 struct node{ 14 int x,y,v; 15 bool operator < (const node oth) const {return v>oth.v;} 16 }; 17 //Definition;// 18 int n,m,qn; 19 node e[M]; 20 //INput;// 21 int fth[N],depth[N],ast[N][L+10],mnv[N][L+10]; 22 vector<int> gr[N],dis[N];
23 //Usage;// 24 int fnd(int x){return (fth[x]==x?x:fth[x]=fnd(fth[x]));} 25 void uni(int x,int y){ 26 x=fnd(x);y=fnd(y); 27 if(x!=y)fth[y]=x; 28 } 29 void kruskal(){ 30 sort(e+1,e+1+m); 31 for(int i=0;i<N;i++)fth[i]=i; 32 for(int i=1;i<=m;i++) 33 if(fnd(e[i].x)!=fnd(e[i].y)){
34 uni(e[i].x,e[i].y); 35 gr[e[i].x].push_back(e[i].y);dis[e[i].x].push_back(e[i].v); 36 gr[e[i].y].push_back(e[i].x);dis[e[i].y].push_back(e[i].v); 37 } 38 } 39 40 void dfs(int x,int f,int d){ 41 depth[x]=d;ast[x][0]=f; 42 for(size_t i=0;i<gr[x].size();i++) 43 if(gr[x][i]!=f){ 44 dfs(gr[x][i],x,d+1); 45 mnv[gr[x][i]][0]=dis[x][i]; 46 } 47 } 48 int lca(int x,int y){ 49 int res=INF; 50 if(depth[x]<depth[y])swap(x,y); 51 for(int i=0;i<=L;i++) 52 if((depth[x]-depth[y])>>i&1) 53 res=min(res,mnv[x][i]),x=ast[x][i]; 54 55 if(x==y)return res; 56 57 for(int i=L;i>=0;i--) 58 if(ast[x][i]!=ast[y][i]) 59 res=min(res,min(mnv[x][i],mnv[y][i])),x=ast[x][i],y=ast[y][i]; 60 61 return min(res,min(mnv[x][0],mnv[y][0])); 62 } 63 int main(){ 64 scanf("%d%d",&n,&m); 65 for(int i=1;i<=m;i++)scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].v); 66 67 kruskal(); 68 69 dfs(1,0,0); 70 for(int j=1;j<=L;j++) 71 for(int i=1;i<=n;i++){ 72 ast[i][j]=ast[ast[i][j-1]][j-1]; 73 mnv[i][j]=min(mnv[i][j-1],mnv[ast[i][j-1]][j-1]); 74 } 75 76 scanf("%d",&qn); 77 while(qn--){ 78 int qx,qy,ans; 79 scanf("%d%d",&qx,&qy); 80 ans=lca(qx,qy); 81 printf("%d\n",ans?ans:-1); 82 } 83 return 0; 84 }
Method_01

  Vijos 483ms 洛谷 733ms CodeVS 503ms

  另外最近發現Vijos 的評測機真快,除了TLE 外不管對錯都是瞬間給結果,不像CodeVS 拖得死,總是等待測評,總用時0ms 的都像是超時了一樣。

貨車運輸——幾經波折,重打幾次,終於完全完成