您的位置:首页 > 其它

sicily 5144 catch the thief

2015-01-10 16:16 274 查看
题目见 http://soj.sysu.edu.cn/show_problem.php?pid=5144
大意:

小偷要从城市1到城市n,给出n个城市的距离矩阵,已知小偷会选择最短路逃跑,问小偷有可能经过几个城市?

思路:

这个问题是多条最短路的问题,要找出所有最短路上的点。可以从起点S和终点T分别求一次最短路,结果分别用dist1[]数组和dist2[] 数组表示。 如果dist1[i] + dist2[i] == dist1[T] (即最短路的长度),那么i点在最短路上。

后来发现这道题目数据数据大小n没给,实际测试发现n出比较小,可以用floyed算法3重循环过。算法思路类似,求出所以点间的距离d[][],然后循环j判断d[0][j] + d[j][n-1] == d[0][n-1]是否成立,若成立则点在最短路上。

因为之前做类似题目较少,所以总结记录下。

floyed代码如下:

// Problem#: 5144
// Submission#: 3517043
// The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
// URI: http://creativecommons.org/licenses/by-nc-sa/3.0/ // All Copyright reserved by Informatic Lab of Sun Yat-sen University
#include <bits/stdc++.h>
using namespace std;
map<int,int> v;
int n,m;
int maxd = 1000000000;

int mm[1010][1010];

int d[1010][1010];
void floyed(){
memcpy(d,mm,sizeof(mm));

for(int i=0;i<n;i++){
for(int j =0;j<n;j++){
for(int k =0;k<n;k++){
if(d[j][k] > d[j][i]+d[i][k]){   // 经过i中转
d[j][k] = d[j][i]+d[i][k];
}
}
}
}
}
int main(){
while(cin >> n&&n){
memset(mm,0,sizeof(mm));
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin >> mm[i][j];
if(mm[i][j]==-1)  mm[i][j] = maxd;
}
}
floyed();
int ans = 2;
for (int j=1;j<n-1;j++)
if (d[0][j]+d[j][n-1]==d[0][n-1])   // 循环判断每个点是否在最短路上
ans++;
cout << ans << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: