求助!!!!!!求助!!!!!
查看原帖
求助!!!!!!求助!!!!!
49901
duuong楼主2021/11/24 23:44

救救孩子吧!!!,最后一个点实在过不去了!!!!

//适用于不含负权边的图
#include <iostream>
#include <cstdlib>
#include <queue>
#include <cmath>
#include <cstring>
using namespace std;
int vis[20100] = {}; 
int head[20100] = {},cnt = 0;

double dis[20100] = {};
struct point
{
	int x,y;
	double num;
};


point list[20100],haha;


struct node
{
	double dis;
	int pos;
	bool operator <( const node &x )const
    {
        return x.dis < dis;
    }
}; 

struct edge
{
	int to;
	double dis;
	int next;	
}e[20000];
inline void add(int u,int v,double val)
{
	cnt++;
	e[cnt].to = v;
	e[cnt].dis = val;
	e[cnt].next = head[u];
	head[u] = cnt;
	
}
void clear(priority_queue<node>& q) 
{
	priority_queue<node> empty;
	swap(empty, q);
}
priority_queue<node> q;
inline void dijistra(double *dis,int s1,int s2,int s3,int s4)
{
	dis[s1] = 0;
	dis[s2] = 0;
	dis[s3] = dis[s4] = 0; 
	clear(q);
	q.push((node) {0,s1});
	q.push((node) {0,s2});
	q.push((node) {0,s3});
	q.push((node) {0,s4});
	int i,j;
	memset(vis,0,sizeof(vis));
	while (!q.empty())
	{
		node tmp = q.top();
		//printf("ha%d %d %lf\n",s,tmp.pos,tmp.dis);
		q.pop();
		if (vis[tmp.pos])
			continue;
		vis[tmp.pos] = 1;
		for (i = head[tmp.pos];i;i = e[i].next)
		{
			if (dis[e[i].to] > dis[tmp.pos] + e[i].dis)
			{
				dis[e[i].to] = dis[tmp.pos] + e[i].dis;
				if (!vis[e[i].to])
				{
					q.push((node) {dis[e[i].to],e[i].to});
					//vis[e[i].to] = 1;
				}
			}
		}
		
	}
	return ;
}
double cal(point a,point b)
{
	return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}
point call(point x,point y,point z)
{
	point ha;
	ha.x = y.x - (x.x - z.x);
	ha.y = y.y - (x.y - z.y);
	return ha;
}
point test(point a,point b,point c)
{
	double sum1,sum2,sum3;
	sum1 = cal(a,b);
	sum2 = cal(a,c);
	sum3 = cal(b,c);
	//printf("%lf %lf %lf\n",sum1,sum2,sum3);
	if (abs(sum1 * sum1 + sum2 * sum2 - sum3 * sum3) < 1e-5)
		return call(a,b,c);
	if (abs(sum1 * sum1 + sum3 * sum3 - sum2 * sum2) < 1e-5)
		return call(b,a,c);
	if (abs(sum2 * sum2 + sum3 * sum3 - sum1 * sum1) < 1e-5)
		return call(c,b,a);
	//printf("no\n");
}

void add_jin(point a,point b,int T)
{
	double num = cal(a,b) * T;
	add(a.num,b.num,num);
	add(b.num,a.num,num);
}
int main()
{
	int i,j;
	int n;
	int x,y,z;
	int s,t,A,B,T;
	int num = 0;
	double minn;
	scanf("%d",&n);
	for (z = 1;z <= n;z++)
	{
		scanf("%d%d%d%d",&s,&t,&A,&B);
		num = 0;
		cnt = 0;
		for (i = 1;i <= s;i++)
		{
			for (j = 1;j <= 3;j++)
			{
				scanf("%d%d",&x,&y);
				num++;
				list[num].x = x;
				list[num].y = y;
				list[num].num = num;		
			}
			scanf("%d",&T);
			num++;
			list[num] = test(list[num - 1],list[num - 2],list[num - 3]);
			//printf("%d %d\n",list[num].x,list[num].y);
			list[num].num = num;	
			add_jin(list[num],list[num - 1],T);
			add_jin(list[num - 1],list[num - 2],T);
			add_jin(list[num - 2],list[num - 3],T);
			add_jin(list[num],list[num - 3],T);
			for (j = 1;j <= num - 4;j++)
			{
				add_jin(list[j],list[num - 1],t);
				add_jin(list[j],list[num - 2],t);
				add_jin(list[j],list[num - 3],t);
				add_jin(list[j],list[num],t);
			}
		}
		/*
		for (i = 1;i <= cnt;i++)
			printf("%d %lf\n",e[i].to,e[i].dis);
		
		for (i = head[3];i;i = e[i].next)
		{
			printf("%lf %d\n",e[i].dis,e[i].to);
		}
		*/
		minn = 0xfff;
		//printf("%lf\n",minn);
		for (int i=1; i<=4*s; i++) dis[i]=99999999.99999;
		dijistra(dis,(A - 1) * 4  + 1,(A - 1) * 4  + 2,(A - 1) * 4  + 3,(A - 1) * 4  + 4);
		printf("no%lf\n",dis[(B - 1) * 4 + 1]);
		printf("no%lf\n",dis[(B - 1) * 4 + 2]);
		printf("no%lf\n",dis[(B - 1) * 4 + 3]);
		printf("no%lf\n",dis[(B - 1) * 4 + 4]);
		minn = minn > dis[(B - 1) * 4 + 1] ? dis[(B - 1) * 4 + 1] : minn;
		minn = minn > dis[(B - 1) * 4 + 2] ? dis[(B - 1) * 4 + 2] : minn;
		minn = minn > dis[(B - 1) * 4 + 3] ? dis[(B - 1) * 4 + 3] : minn;
		minn = minn > dis[(B - 1) * 4 + 4] ? dis[(B - 1) * 4 + 4] : minn;			
		printf("%.1lf\n",minn);
	}
}
2021/11/24 23:44
加载中...