码迷,mamicode.com
首页 > 其他好文 > 详细

货车运输——几经波折,重打几次,终于完全完成

时间:2017-07-28 22:32:05      阅读:185      评论:0      收藏:0      [点我收藏+]

标签:input   kruskal   scanf   mat   res   log   ret   node   i++   

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

技术分享
 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 的都像是超时了一样。

货车运输——几经波折,重打几次,终于完全完成

标签:input   kruskal   scanf   mat   res   log   ret   node   i++   

原文地址:http://www.cnblogs.com/duskfire/p/7252512.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!