题目Re,人已崩溃,能过样例,就是Re
查看原帖
题目Re,人已崩溃,能过样例,就是Re
133116
Xhesika_Frost楼主2020/8/5 22:29
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstring>
#include<stack>
using namespace std;
int s,t;
int n,e;
int x,y;
double r,d;
int fa[101];
double dis[101];
int head[101];
int b=1;
int lu[101];
double ht[101];
bool vis[101];
struct dj{
	int v;
	int id;
	friend bool operator < (dj xxx,dj yyy){
		return xxx.v>yyy.v;
	} 
};
dj too,tooo;
priority_queue <dj> q;
struct ee{
	int to;
	int ne;
	int f;
	double t;
	double  l;
}e1[20001],e2[20001];
int p;
void add(int f,int to,double t,double l){
	p++;
	e1[p].ne=head[f];
	e1[p].to=to;
	e1[p].f=f;
	e1[p].t=t;
	e1[p].l=l;
	head[f]=p;
}
void add2(int f,int to,double t,double l){
	p++;
	e2[p].f=f;
	e2[p].ne=head[f];
	e2[p].to=to;
	e2[p].t=t;
	e2[p].l=l;
	head[f]=p;
}
bool cmp (ee xx,ee yy){
	return xx.t<yy.t;
}
int find(int x){
	return fa[x]==x? x: fa[x]=find(fa[x]);
}
void sp(){
	for(int i=1;i<=n;++i){
		dis[i]=0x3f3f3f3f;
	}
	dis[s]=0;
	lu[s]=s;
	too.id=s;
	too.v=0;
	q.push(too);
	while(!q.empty()){
	//	cout<<"a";
		too=q.top();
		if(vis[too.id]) continue;
		vis[too.id]=1;
		q.pop();
		for(int i=head[too.id];i;i=e2[i].ne){
		//	cout<<dis[e2[i].to]<<"b ";
			if(dis[e2[i].to]>dis[too.id]+e2[i].l){
		//		cout<<342;
				dis[e2[i].to]=dis[too.id]+e2[i].l;
				lu[e2[i].to]=too.id;
				ht[e2[i].to]=max(ht[too.id],e2[i].t);
				tooo.id=e2[i].to;
				tooo.v=dis[e2[i].to];
				q.push(tooo);
			}
		}
	}
//	cout<<2;
	return ;
}
void kr(){
	b=1;
	p=0;
	for(int i=1;i<=n;++i)
	fa[i]=i;
	sort(e1+1,e1+e+1,cmp);
	memset(head,0,sizeof(head));
	for( int i=1;i<n;){
		x=find(e1[b].f);
		y=find(e1[b].to);
		//add2(e1[b].to,e1[b].f,e1[b].t,e1[b].l); 
		add2(e1[b].f,e1[b].to,e1[b].t,e1[b].l);
		b++;
		if(x!=y){
			fa[x]=y;
			i++;
		}
	}
//	cout<<b;
	sp();
	return ;
}
void pr(int now){
//	cout<<now;
	if(now==s){
		cout<<s<<" ";
		return ;
	}
	pr(lu[now]);
	printf("%d ",now);
}
int main(){
	while((scanf("%d%d",&n,&e))!=EOF){
		memset(head,0,sizeof(head));
		memset(vis,0,sizeof(vis));
		memset(lu,0,sizeof(lu));
		p=0;
		scanf("%d%d",&s,&t);
	for(int i=1;i<=e;++i){
		scanf("%d%d%lf%lf",&x,&y,&r,&d);
		add(x,y,r,d);
		add(y,x,r,d);
	} 
	kr();
//	for(int i=1;i<=n;++i){
//		cout<<lu[i]<<" ";
//	}
//	cin>>x;
	pr(t); 
	printf("\n");
	printf("%.1lf %.1lf",dis[t],ht[t]);
	return 0;
	}
} 
2020/8/5 22:29
加载中...