无形资产 网站建设,wordpress 会员插件,wordpress 下载远程图片大小,中国城投建设集团有限公司网站Floyd求最短路
给定一个 n 个点 m 条边的有向图#xff0c;图中可能存在重边和自环#xff0c;边权可能为负数。
再给定 k 个询问#xff0c;每个询问包含两个整数 x 和 y#xff0c;表示查询从点 x 到点 y 的最短距离#xff0c;如果路径不存在#xff0c;则输出 impo…Floyd求最短路
给定一个 n 个点 m 条边的有向图图中可能存在重边和自环边权可能为负数。
再给定 k 个询问每个询问包含两个整数 x 和 y表示查询从点 x 到点 y 的最短距离如果路径不存在则输出 impossible。
数据保证图中不存在负权回路。
输入格式
第一行包含三个整数 n,m,k
接下来 m 行每行包含三个整数 x,y,z表示存在一条从点 x 到点 y 的有向边边长为 z。
接下来 k 行每行包含两个整数 x,y表示询问点 x 到点 y 的最短距离。
输出格式
共 k 行每行输出一个整数表示询问的结果若询问两点间不存在路径则输出 impossible。
数据范围
1≤n≤200 1≤k≤n2 1≤m≤20000 图中涉及边长绝对值均不超过 10000
输入样例
3 3 2
1 2 1
2 3 2
1 3 1
2 1
1 3输出样例
impossible
1#includeiostream
#includealgorithm
#includecstring
using namespace std;
const int N220,INF0x3f3f3f3f;
int f[N][N];
int main()
{int n,m,K;cinnmK;memset(f,0x3f,sizeof f);for(int i0;in;i) f[i][i]0;while(m--){int x,y,z;cinxyz;f[x][y]min(f[x][y],z);}for(int k1;kn;k){for(int i1;in;i){for(int j1;jn;j)f[i][j]min(f[i][j],f[i][k]f[k][j]);}}while(K--){int a,b;cinab;if(f[a][b]INF/2) coutimpossibleendl;else coutf[a][b]endl;}return 0;
}
牛的旅行
农民John的农场里有很多牧区有的路径连接一些特定的牧区。
一片所有连通的牧区称为一个牧场。
但是就目前而言你能看到至少有两个牧区不连通。
现在John想在农场里添加一条路径注意恰好一条。
一个牧场的直径就是牧场中最远的两个牧区的距离本题中所提到的所有距离指的都是最短的距离。
考虑如下的两个牧场每一个牧区都有自己的坐标 图 1 是有 5 个牧区的牧场牧区用“*”表示路径用直线表示。
图 1 所示的牧场的直径大约是 12.07106, 最远的两个牧区是 A 和 E它们之间的最短路径是 A-B-E。
图 2 是另一个牧场。
这两个牧场都在John的农场上。
John将会在两个牧场中各选一个牧区然后用一条路径连起来使得连通后这个新的更大的牧场有最小的直径。
注意如果两条路径中途相交我们不认为它们是连通的。
只有两条路径在同一个牧区相交我们才认为它们是连通的。
现在请你编程找出一条连接两个不同牧场的路径使得连上这条路径后所有牧场生成的新牧场和原有牧场中直径最大的牧场的直径尽可能小。
输出这个直径最小可能值。
输入格式
第 1 行一个整数 N, 表示牧区数
第 2 到 N1 行每行两个整数 X,Y 表示 N 个牧区的坐标。每个牧区的坐标都是不一样的。
第 N2 行到第 2*N1 行每行包括 N 个数字 ( 0或1 ) 表示一个对称邻接矩阵。
例如题目描述中的两个牧场的矩阵描述如下 A B C D E F G H
A 0 1 0 0 0 0 0 0
B 1 0 1 1 1 0 0 0
C 0 1 0 0 1 0 0 0
D 0 1 0 0 1 0 0 0
E 0 1 1 1 0 0 0 0
F 0 0 0 0 0 0 1 0
G 0 0 0 0 0 1 0 1
H 0 0 0 0 0 0 1 0输入数据中至少包括两个不连通的牧区。
输出格式
只有一行包括一个实数表示所求答案。
数字保留六位小数。
数据范围
1≤N≤150
0≤X,Y≤10^5
输入样例
8
10 10
15 10
20 10
15 15
20 15
30 15
25 10
30 10
01000000
10111000
01001000
01001000
01110000
00000010
00000101
00000010输出样例
22.071068
直径最大值最小 题目的问题给定两个联通块在两个连通块中各取任意一点进行连接合成一个连通块求合并后的联通块的最长路径的最小值 floyd 这里可以分为两种情况一种是在同一个连通分量还有一种是不在同一个连通分量1.在同一连通分量我们用maxd[i]表示和i所在连通分量的最长直径那么这里的答案就是max1≤i≤nmaxd[i]max1≤i≤nmaxd[i] 2.不在同一连通分量 我们可以用两个连通分量的maxd它们之间的最短距离即可 这里的答案就是maxd[i]get (i,j)max[j] #includeiostream
#includecstring
#includealgorithm
#includecmath
#define x first
#define y second
using namespace std;
typedef pairint,intPII;
const int N200;
const double INF1e20;
PII q[N];//存储n个牧场的坐标
char g[N][N];//存储n个牧场之间是否有边
double d[N][N];//存储n牧场之间的距离最下值
double dmax[N];//dmax[i]表示 i所在的连通分量的最长直径
int n;
//两个牧场之间的距离
double get_dist(PII a,PII b)
{double dxb.x-a.x,dyb.y-a.y;return sqrt(dx*dxdy*dy);
}
int main()
{cinn;for(int i0;in;i) cinq[i].xq[i].y;for(int i0;in;i) cing[i];for(int i0;in;i){for(int j0;jn;j){if(i!j){if(g[i][j]1)d[i][j]get_dist(q[i],q[j]);else d[i][j]INF;}}}//floyd 得出d[i][j] 距离的最小值for(int k0;kn;k){for(int i0;in;i){for(int j0;jn;j){d[i][j]min(d[i][j],d[i][k]d[k][j]);}}}for(int i0;in;i){for(int j0;jn;j){if(d[i][j]INF){dmax[i]max(dmax[i],d[i][j]);}}}double ans10;//情况1for(int i0;in;i) ans1max(ans1,dmax[i]);double ans2INF;//情况2for(int i0;in;i){for(int j0;jn;j){if(d[i][j]INF){ans2min(ans2,get_dist(q[i],q[j])dmax[i]dmax[j]);}}}printf(%.6lf\n,max(ans1,ans2));return 0;
}
排序传递闭包 给定 n 个变量和 m 个不等式。其中 n 小于等于 26变量分别用前 n 的大写英文字母表示。
不等式之间具有传递性即若 AB 且 BC则 AC。
请从前往后遍历每对关系每次遍历时判断
如果能够确定全部关系且无矛盾则结束循环输出确定的次序如果发生矛盾则结束循环输出有矛盾如果循环结束时没有发生上述两种情况则输出无定解。
输入格式
输入包含多组测试数据。
每组测试数据第一行包含两个整数 n 和 m。
接下来 m 行每行包含一个不等式不等式全部为小于关系。
当输入一行 0 0 时表示输入终止。
输出格式
每组数据输出一个占一行的结果。
结果可能为下列三种之一
如果可以确定两两之间的关系则输出 Sorted sequence determined after t relations: yyy...y.,其中t指迭代次数yyy...y是指升序排列的所有变量。如果有矛盾则输出 Inconsistency found after t relations.其中t指迭代次数。如果没有矛盾且不能确定两两之间的关系则输出 Sorted sequence cannot be determined.。
数据范围
2≤n≤26变量只可能为大写字母 A∼Z。
输入样例1
4 6
AB
AC
BC
CD
BD
AB
3 2
AB
BA
26 1
AZ
0 0输出样例1
Sorted sequence determined after 4 relations: ABCD.
Inconsistency found after 2 relations.
Sorted sequence cannot be determined.输入样例2
6 6
AF
BD
CE
FD
DE
EF
0 0输出样例2
Inconsistency found after 6 relations.输入样例3
5 5
AB
BC
CD
DE
EA
0 0输出样例3
Sorted sequence determined after 4 relations: ABCDE. #includeiostream
#includecstring
#includealgorithm
using namespace std;
const int N30;
bool g[N][N],d[N][N];
bool st[N];
int n,m;
void floyd()//通过floyd 来逐渐判断两个点的连通情况
{memcpy(d,g,sizeof d);for(int k0;kn;k)for(int i0;in;i)for(int j0;jn;j)if(!d[i][j]) d[i][j]d[i][k]d[k][j];}
int check()
{for(int i0;in;i)//矛盾情况 AAif(d[i][i]) return 2;for(int i0;in;i)for(int j0;ji;j)//不能确定情况if(!d[i][j]!d[j][i]) return 0;//可以确定情况return 1;
}
char get_min()//每次取出最小值
{for(int i0;in;i){if(!st[i])//如果没有取出 {bool flagtrue;for(int j0;jn;j)//判断是否 最小{if(!st[j]d[j][i]) {flagfalse;break;}}if(flag){st[i]true;return Ai;}}}
}
int main()
{while(cinnm,n||m){memset(g,0,sizeof g);int type0,t;// t 记录轮次 type记录判断出来与否的标志for(int i1;im;i){char str[10];cinstr;int astr[0]-A,bstr[2]-A;if(!type){g[a][b]1;floyd();typecheck();if(type) ti;}}if(!type) coutSorted sequence cannot be determined.endl;else if(type2)printf(Inconsistency found after %d relations.\n,t);else{memset(st,0,sizeof st);printf(Sorted sequence determined after %d relations: ,t);for(int i0;in;i) printf(%c,get_min());printf(.\n);}}return 0;
}