记录编号 394176 评测结果 AAAAAAAAAA
题目名称 [NOIP 2013]货车运输 最终得分 100
用户昵称 GravatarWildRage 是否通过 通过
代码语言 C++ 运行时间 0.195 s
提交时间 2017-04-13 08:41:02 内存使用 3.86 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
struct edge{
	int START,END,w,next;
	bool operator < (const edge &a)const{
		return w>a.w;
	}
}v[100005],r[100005];
struct Op{
	int S,E,ans;
}op[30005];
int T[10005],dis[10005],father[10005];
int first[10005],p=1;
int find(int a){
	if(father[a]!=a)father[a]=find(father[a]);
	return father[a];
}
void add(int a,int b,int c){
	v[p].END=b;
	v[p].w=c;
	v[p].next=first[a];
	first[a]=p++;
}
void spfa(int x){
	memset(dis,-1,sizeof(dis));
	dis[x]=0x7fffffff;
	int flag[10005]={0};
	queue<int> Q;
	Q.push(x);
	while(!Q.empty()){
		int k=Q.front();
		for(int i=first[k];i!=-1;i=v[i].next){
			if(dis[v[i].END]<min(dis[k],v[i].w)){
				dis[v[i].END]=min(dis[k],v[i].w);
				if(!flag[v[i].END]){
					flag[v[i].END]=1;
					Q.push(v[i].END);
				}
			}
		}
		Q.pop();flag[k]=0;
	}
}
int main()
{
    freopen("truck.in","r",stdin);
    freopen("truck.out","w",stdout);
    memset(first,-1,sizeof(first));
	int n,m,a,b,c;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&a,&b,&c);
		r[p].START=a;
		r[p].END=b;
		r[p].w=c;
		p++;
		r[p].START=b;
		r[p].END=a;
		r[p].w=c;
		p++;
	}
	int P;
	scanf("%d",&P);
	for(int i=1;i<=P;i++){
		scanf("%d%d",&op[i].S,&op[i].E);
		T[op[i].S]++;
		T[op[i].E]++;
	}
	sort(r+1,r+p);
	for(int i=1;i<=n;i++)father[i]=i;
	int k=0;
	int K=p;
	p=1;
	for(int i=1;i<K;i++){
		int x=r[i].START;
		int y=r[i].END;
		if(find(x)!=find(y)){
			father[find(y)]=find(x);
			add(x,y,r[i].w);
			add(y,x,r[i].w);
			k++;
		}
		if(k==n-1)break;
	}
	for(int i=1;i<=n;i++){
		if(T[i]>0){
			spfa(i);
			for(int j=1;j<=P;j++){
				if(op[j].ans==0){
					if(op[j].S==i){
						op[j].ans=dis[op[j].E];
						T[op[j].S]--;
						T[op[j].E]--;
					}else if(op[j].E==i){
						op[j].ans=dis[op[j].S];
						T[op[j].S]--;
						T[op[j].E]--;
					}
				}
			}
		}
	}
	for(int i=1;i<=P;i++){
		printf("%d\n",op[i].ans);
	}
	//while(1);
}