记录编号 328291 评测结果 AAAAAAAAAA
题目名称 [郑州培训2012] 暴力摩托 最终得分 100
用户昵称 GravatarAntiLeaf 是否通过 通过
代码语言 C++ 运行时间 0.114 s
提交时间 2016-10-23 21:26:55 内存使用 0.30 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=210,maxe=1010;
struct edge1{
	int from,to,w;
	bool operator<(const edge1 &e)const{return w<e.w;}
}ee[maxe];
struct edge{int to,w,prev;}e[maxe<<1];
int findroot(int);
void mergeset(int,int);
void addedge(int,int,int);
void deledge(int,int);
void dfs(int);
int n,m,k,last[maxn],len=0,prt[maxn],cnt=0,p[maxn],u[maxn],v[maxn],ans[maxn];
int main(){
#define MINE
#ifdef MINE
	freopen("motor.in","r",stdin);
	freopen("motor.out","w",stdout);
#endif
	memset(last,-1,sizeof(last));
	memset(ans,63,sizeof(ans));
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)prt[i]=i;
	for(int i=1;i<=m;i++)scanf("%d%d%d",&ee[i].from,&ee[i].to,&ee[i].w);
	scanf("%d",&k);
	for(int i=1;i<=k;i++)scanf("%d%d",&u[i],&v[i]);
	sort(ee+1,ee+m+1);
	for(int i=1;i<=m;i++){
		if(findroot(ee[i].from)==findroot(ee[i].to)){
			memset(p,-1,sizeof(p));
			dfs(ee[i].from);
			int j=p[ee[i].to];
			for(int x=e[p[ee[i].to]].to;x!=ee[i].from;x=e[p[x]].to)if(e[p[x]].w<e[j].w)j=p[x];
			deledge(e[j].to,j^1);
			deledge(e[j^1].to,j);
		}
		else{
			cnt++;
			mergeset(ee[i].from,ee[i].to);
		}
		addedge(ee[i].from,ee[i].to,ee[i].w);
		addedge(ee[i].to,ee[i].from,ee[i].w);
		for(int i=1;i<=k;i++){
			memset(p,-1,sizeof(p));
			dfs(v[i]);
			int mx=1<<31,mn=~mx;
			int x=u[i];
			for(;p[x]!=-1&&x!=v[i];x=e[p[x]].to){
				mn=min(mn,e[p[x]].w);
				mx=max(mx,e[p[x]].w);
			}
			if(x==v[i])ans[i]=min(ans[i],mx-mn);
		}
	}
	for(int i=1;i<=k;i++)printf("%d\n",ans[i]);
#ifndef MINE
	printf("\n-------------------------DONE-------------------------\n");
	for(;;);
#endif
	return 0;
}
int findroot(int x){return prt[x]==x?x:(prt[x]=findroot(prt[x]));}
void mergeset(int x,int y){prt[findroot(x)]=findroot(y);}
void addedge(int x,int y,int z){
	e[len].to=y;
	e[len].w=z;
	e[len].prev=last[x];
	last[x]=len++;
}
void deledge(int x,int i){
	if(last[x]==i)last[x]=e[i].prev;
	else for(int j=last[x];j!=-1;j=e[j].prev)if(e[j].prev==i){
		e[j].prev=e[i].prev;
		break;
	}
}
void dfs(int x){
	for(int i=last[x];i!=-1;i=e[i].prev)if(p[x]==-1||e[i].to!=e[p[x]].to){
		p[e[i].to]=i^1;
		dfs(e[i].to);
	}
}