刷题日记嘛,没什么好说的
/***************************
author: xiecong
***************************/
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <string>
#include <queue>
#include <map>
#include <set>
using namespace std;
typedef unsigned char uchar;
pair<int, unsigned short> Edge[1000+5];
int pre[205];
int fd(int x)
{
return x==pre[x]?x:pre[x]=fd(pre[x]);
}
int main()
{
int m, n, nn;
int from, to, ans;
while(scanf("%d%d",&n,&m)==2)
{
for(int i=0;i<m;i++)
{
scanf("%d %d %d",&from, &to,&Edge[i].first);
Edge[i].second= from + (to<<8);
}
sort(Edge,Edge+m);
scanf("%d",&nn);
for(int i=0;i<nn;i++)
{
ans = 0x7fffffff;
scanf("%d%d",&from,&to);
int lst, mst;
for(lst=0;lst<m;lst++)
{
for(int t=1;t<=n;t++) pre[t]=t;
for (mst=lst;mst<m;mst++)
{
int A = fd (Edge[mst].second>>8);
int B = fd (uchar(Edge[mst].second) );
if (A != B) pre[B] = A;
if (fd(from) == fd(to))
{
if (ans > Edge[mst].first - Edge[lst].first)
ans = Edge[mst].first - Edge[lst].first;
break;
}
}
if (mst == m) break;
}
if(ans == 0x7fffffff) cout<<"-1\n";
else cout<<ans<<endl;
}
}
return 0;
}
就是一个最小生成树,题目数据水,没卡你算法,基本能算出来的都能过吧
然后有个剪枝,就是搜到上界发现还没有可行解的时候可以再枚举下界已经没有意义了,因为再也找不到可行解了。
然后是自己惯用的状压,学计算机网络套字段留下来的习惯,能压缩的习惯就套简单压缩,也不会很高级的压缩