最短路三水题

1077 多源最短路

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 黄金 Gold
题目描述 Description

已知n个点(n<=100),给你n*n的方阵,a[i,j]表示从第i个点到第j个点的直接距离。        

现在有Q个询问,每个询问两个正整数,a和b,让你求a到b之间的最短路程。        

满足a[i,j]=a[j,i];

输入描述 Input Description

 第一行一个正整数n,接下来n行每行n个正整数,满足a[i,i]=0,再一行一个Q,接下来Q行,每行两个正整数a和b。

输出描述 Output Description

一共Q行,每行一个整数。

样例输入 Sample Input

3

 0 1 1

1 0 3

1 3 0

1

2 3

样例输出 Sample Output

2

数据范围及提示 Data Size & Hint

n<=100,Q可能非常大。g[i][j]均>=0

请使用flyod算法

使用C/C++的同学请注意:由于输入数据较大,使用cin和cout会导致程序超时。请使用scanf与printf进行输入和输出。

#include<iostream>
#include<cstdio>
using namespace std;
int n;int a[200][200];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
scanf("%d",&a[i][j]);
}
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(a[i][j]>a[i][k]+a[k][j])
{
a[i][j]=a[i][k]+a[k][j];
}
}
int Q;
cin>>Q;int x,y;
for(int i=1;i<=Q;i++)
{
cin>>x>>y;
printf("%d\n",a[x][y]);
}
return 0;
}





T2

1079 回家

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 白银 Silver
题目描述 Description

现在是晚餐时间,而母牛们在外面分散的牧场中。 农民约翰按响了电铃,所以她们开始向谷仓走去。 你的工作是要指出哪只母牛会最先到达谷仓(在给出的测试数据中,总会有且只有一只最快的母牛)。 在挤奶的时候(晚餐前),每只母牛都在她自己的牧场上,一些牧场上可能没有母牛。 每个牧场由一条条道路和一个或多个牧场连接(可能包括自己)。 有时,两个牧场(可能是字母相同的)之间会有超过一条道路相连。 至少有一个牧场和谷仓之间有道路连接。 因此,所有的母牛最后都能到达谷仓,并且母牛总是走最短的路径。 当然,母牛能向着任意一方向前进,并且她们以相同的速度前进。 牧场被标记为'a'..'z'和'A'..'Y',在用大写字母表示的牧场中有一只母牛,小写字母中则没有。 谷仓的标记是'Z',注意没有母牛在谷仓中。

注意'm'和'M'不是同一个牧场否则错误上面的意思是说:输入数据中可能会同时存在M,m(郁闷ing),比如

M a a m m z

输入描述 Input Description

第 1 行: 整数 P(1<= P<=10000),表示连接牧场(谷仓)的道路的数目。

第 2 ..P+1行:  用空格分开的两个字母和一个整数:

被道路连接牧场的标记和道路的长度(1<=长度<=1000)。

输出描述 Output Description

单独的一行包含二个项目:最先到达谷仓的母牛所在的牧场的标记,和这只母牛走过的路径的长度。

样例输入 Sample Input

5

A d 6

B d 3

C e 9

d Z 8

e Z 3

样例输出 Sample Output

B 11



#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
char f[53];
int v[53][53];
int main()
{
	int p;
	cin>>p;
	memset(v,11,sizeof(v));
	memset(f,-1,sizeof(f));
	for(int i=0;i<p;i++)
	{
		char a,b;
		int t,t1,t2;
		cin>>a>>b>>t;
		t1=a<'a'? a-'A'+'z'-'a'+1:a-'a';
		t2=b<'a'? b-'A'+'z'-'a'+1:b-'a';
		if(a<'a')
            f[t1] = a;
        if(b<'a')
            f[t2] = b;
		v[t1][t2]=min(v[t1][t2],t);
		v[t2][t1]=min(v[t2][t1],t);
	}
	int l=51;
	for(int k=0;k<=l;k++){
	for(int i=0;i<=l;i++){
	for(int j=0;j<=l;j++)
	{
		v[i][j]=min(v[i][j],v[i][k]+v[k][j]);
	}}}
	int ans=1000000000;
	char t;
	for(int i=0;i<l;i++)
	{
		if(f[i]!=-1&&ans>v[i][l])
		{
			t=f[i];
			ans=v[i][l];
		}
	}
	cout<<t<<" "<<ans<<'\n';
	return 0;
}

T3....不知道算不算水题吧,,找ju形的第四个点,,

1041 Car的旅行路线

 

2001年NOIP全国联赛提高组

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 钻石 Diamond
题目描述 Description

又到暑假了,住在城市A的Car想和朋友一起去城市B旅游。她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路,第I个城市中高速铁路了的单位里程价格为Ti,任意两个不同城市的机场之间均有航线,所有航线单位里程的价格均为t。

那么Car应如何安排到城市B的路线才能尽可能的节省花费呢?她发现这并不是一个简单的问题,于是她来向你请教。
任务
找出一条从城市A到B的旅游路线,出发和到达城市中的机场可以任意选取,要求总的花费最少。

输入描述 Input Description

第一行为一个正整数n(0<=n<=10),表示有n组测试数据。
每组的第一行有四个正整数s,t,A,B。
S(0<S<=100)表示城市的个数,t表示飞机单位里程的价格,A,B分别为城市A,B的序号,(1<=A,B<=S)。
接下来有S行,其中第I行均有7个正整数xi1,yi1,xi2,yi2,xi3,yi3,Ti,这当中的(xi1,yi1),(xi2,yi2),(xi3,yi3)分别是第I个城市中任意三个机场的坐标,T I为第I个城市高速铁路单位里程的价格。

输出描述 Output Description

共有n行,每行一个数据对应测试数据。

样例输入 Sample Input

1
3 10 1 3
1 1 1 3 3 1 30
2 5 7 4 5 2 1
8 6 8 8 11 6 3

样例输出 Sample Output

47.5

数据范围及提示 Data Size & Hint

如描述

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
const int maxn=410;
using namespace std;
int n,s,A,B,tot,belone[maxn];
double ans,t,w,x[maxn],y[maxn],map[maxn][maxn];
void prepare()
{
	memset(x,0,sizeof(x));
	memset(y,0,sizeof(y));
	memset(map,0,sizeof(map));
	memset(belone,0,sizeof(belone));
}
void find_four(int i,double c)
{
	int r1=tot-2,r2=tot-1,r3=tot,r4;
	map[r1][r2]=map[r2][r1]=pow((x[r1]-x[r2]),2)+pow((y[r1]-y[r2]),2);
    map[r1][r3]=map[r3][r1]=pow((x[r1]-x[r3]),2)+pow((y[r1]-y[r3]),2);
    map[r3][r2]=map[r2][r3]=pow((x[r3]-x[r2]),2)+pow((y[r3]-y[r2]),2);
    if(map[r1][r2]+map[r1][r3]==map[r2][r3]) r4=r1;
    else if(map[r1][r2]+map[r2][r3]==map[r1][r3]) r4=r2;
    else r4=r3;tot++;
    if(r4==r1){double xx=x[r1]-x[r2],yy=y[r1]-y[r2];x[tot]=x[r3]-xx,y[tot]=y[r3]-yy;}
    if(r4==r2){double xx=x[r1]-x[r2],yy=y[r1]-y[r2];x[tot]=x[r3]+xx,y[tot]=y[r3]+yy;}
    if(r4==r3){double xx=x[r1]-x[r3],yy=y[r1]-y[r3];x[tot]=x[r2]+xx,y[tot]=y[r2]+yy;}
    for(int j=tot-3;j<=tot;j++)
    for(int k=tot-3;k<j;k++)
    map[j][k]=map[k][j]=sqrt(pow(x[j]-x[k],2)+pow(y[j]-y[k],2))*c;
    belone[tot]=i;
}
void floyed()
{
	for(int k=1;k<=tot;k++)
	for(int i=1;i<=tot;i++)
	for(int j=1;j<=tot;j++)
	if(i!=k&&i!=j&&k!=j)
	map[i][j]=min(map[i][j],map[i][k]+map[k][j]);
ans=0x7fffffff;
  for(int i=1;i<=tot;i++)
      for(int j=1;j<=tot;j++)
      if(belone[i]==A&&belone[j]==B)
      ans=min(ans,map[i][j]);
}
int main()
{
	 cin>>n;
    while(n--)
    {
        prepare();
        cin>>s>>t>>A>>B;
        for(int i=1;i<=s;i++)
        {
            for(int j=1;j<=3;j++)
            {
                tot++;
                cin>>x[tot]>>y[tot];
                belone[tot]=i;
            }
            cin>>w;
            find_four(i,w);
        }
        for(int i=1;i<=tot;i++)//不同的城市相连
          for(int j=1;j<i;j++)
          if(belone[i]!=belone[j])
          map[i][j]=map[j][i]=sqrt(pow(x[i]-x[j],2)+pow(y[i]-y[j],2))*t;
        floyed();
        printf("%0.1lf\n",ans);
    }
    return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值