已知n个点(n<=100),给你n*n的方阵,a[i,j]表示从第i个点到第j个点的直接距离。
现在有Q个询问,每个询问两个正整数,a和b,让你求a到b之间的最短路程。
满足a[i,j]=a[j,i];
第一行一个正整数n,接下来n行每行n个正整数,满足a[i,i]=0,再一行一个Q,接下来Q行,每行两个正整数a和b。
一共Q行,每行一个整数。
3
0 1 1
1 0 3
1 3 0
1
2 3
2
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
现在是晚餐时间,而母牛们在外面分散的牧场中。 农民约翰按响了电铃,所以她们开始向谷仓走去。 你的工作是要指出哪只母牛会最先到达谷仓(在给出的测试数据中,总会有且只有一只最快的母牛)。 在挤奶的时候(晚餐前),每只母牛都在她自己的牧场上,一些牧场上可能没有母牛。 每个牧场由一条条道路和一个或多个牧场连接(可能包括自己)。 有时,两个牧场(可能是字母相同的)之间会有超过一条道路相连。 至少有一个牧场和谷仓之间有道路连接。 因此,所有的母牛最后都能到达谷仓,并且母牛总是走最短的路径。 当然,母牛能向着任意一方向前进,并且她们以相同的速度前进。 牧场被标记为'a'..'z'和'A'..'Y',在用大写字母表示的牧场中有一只母牛,小写字母中则没有。 谷仓的标记是'Z',注意没有母牛在谷仓中。
注意'm'和'M'不是同一个牧场否则错误上面的意思是说:输入数据中可能会同时存在M,m(郁闷ing),比如
M a a m m z
第 1 行: 整数 P(1<= P<=10000),表示连接牧场(谷仓)的道路的数目。
第 2 ..P+1行: 用空格分开的两个字母和一个整数:
被道路连接牧场的标记和道路的长度(1<=长度<=1000)。
单独的一行包含二个项目:最先到达谷仓的母牛所在的牧场的标记,和这只母牛走过的路径的长度。
5
A d 6
B d 3
C e 9
d Z 8
e Z 3
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全国联赛提高组
又到暑假了,住在城市A的Car想和朋友一起去城市B旅游。她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路,第I个城市中高速铁路了的单位里程价格为Ti,任意两个不同城市的机场之间均有航线,所有航线单位里程的价格均为t。
那么Car应如何安排到城市B的路线才能尽可能的节省花费呢?她发现这并不是一个简单的问题,于是她来向你请教。
任务
找出一条从城市A到B的旅游路线,出发和到达城市中的机场可以任意选取,要求总的花费最少。

第一行为一个正整数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个城市高速铁路单位里程的价格。
共有n行,每行一个数据对应测试数据。
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
47.5
如描述
#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; }