HDU 1598 find the most comfortable road

http://acm.hdu.edu.cn/showproblem.php?pid=1598

题意:中文题

题解:枚举+最小生成树(Kruskal)。对于每个要查询的s,e,枚举边。总是忘记minn初始化……

  1 #include <iostream>
  2 #include <cstring>
  3 #include <cstdio>
  4 #include <cstdlib>
  5 #include <cmath>
  6 #include <string>
  7 #include <vector>
  8 #include <list>
  9 #include <map>
 10 #include <queue>
 11 #include <stack>
 12 #include <bitset>
 13 #include <algorithm>
 14 #include <numeric>
 15 #include <functional>
 16 #include <set>
 17 #include <fstream>
 18 
 19 using namespace std;
 20 
 21 const int INF=0xfffffff;
 22 const int maxn=2010;
 23 
 24 int N,M;
 25 int V,E;
 26 
 27 int par[maxn];
 28 int rankh[maxn];
 29 struct edge{
 30     int u,v,cost;
 31 };
 32 edge es[maxn];
 33 
 34 bool cmp(const edge& e1,const edge& e2)
 35 {
 36     return e1.cost<e2.cost;
 37 }
 38 
 39 void init(int n)
 40 {
 41     for(int i=0;i<=n;i++)
 42     {
 43         par[i]=i;
 44         rankh[i]=0;
 45     }
 46 }
 47 
 48 int find(int x)
 49 {
 50     if(par[x]==x)
 51     {
 52         return x;
 53     }
 54     else{
 55         return par[x]=find(par[x]);
 56     }
 57 }
 58 
 59 /*int find(int x)
 60 {
 61     while(x!=par[x]) x=par[x];
 62     return x;
 63 }*/
 64 
 65 void unite(int x,int y)
 66 {
 67     x=find(x);
 68     y=find(y);
 69     if(x==y) return;
 70     if(rankh[x]<rankh[y]){
 71         par[x]=y;
 72     }
 73     else{
 74         par[y]=x;
 75         if(rankh[x]==rankh[y]) rankh[x]++;
 76     }
 77 }
 78 
 79 bool same(int x,int y)
 80 {
 81     return find(x)==find(y);
 82 }
 83 
 84 int main()
 85 {
 86     //freopen("/Users/apple/Desktop/暑假/10/10/in","r",stdin);
 87     while(scanf("%d%d",&N,&M)!=EOF)
 88     {
 89         V=N;
 90         E=M;
 91         int minn;
 92         for(int i=0;i<M;i++)
 93         {
 94             scanf("%d%d%d",&es[i].u,&es[i].v,&es[i].cost);
 95             // printf("%d %d %d \n",es[i].u,es[i].v,es[i].cost);
 96         }
 97         //   puts("asdfghjkl");
 98         sort(es,es+E,cmp);
 99         //   for(int i=0;i<M;i++)
100         //   {
101         //       printf("%d %d %d \n",es[i].u,es[i].v,es[i].cost);
102         //   }
103         int Q;
104         scanf("%d",&Q);
105         while(Q--)
106         {
107             int s,e;
108             scanf("%d%d",&s,&e);
109             minn=INF;
110             for(int i=0;i<E;i++)
111             {
112                 init(V);
113                 for(int j=i;j<E;j++)
114                 {
115                     int a=find(es[j].u);
116                     int b=find(es[j].v);
117                     if(a!=b) unite(a,b);
118                     if(find(s)==find(e))
119                     {
120                         minn=min(minn,es[j].cost-es[i].cost);
121                         //printf("%d ",minn);
122                         break;
123                     }
124                 }
125             }
126             if(minn==INF) puts("-1");
127             else printf("%d\n",minn);
128             //puts("");
129         }
130 
131     }
132     
133     return 0;
134 }
posted @ 2014-07-21 09:42  Der_Z  阅读(224)  评论(0编辑  收藏  举报