ZOJ 1064 (最短距离 Floyed STL)
2012-08-14 18:59
337 查看
//这题 我用到了 map和queue的数据结构,Floyed算法。根据题目要求 需要先用优先队列把输出的内容排序 ,后来wa了几次,发现这个小数点的约分也要注意的,一个我根据以前经验根据double保存的不精确性转换成int,另一个是四舍五入得加上0.5的问题,最后就是要看清题意,才开始我认为输出的条件是考虑从牌子处开始记录到目标的里程数和前一个城市开始记录的大小关系,后来发现没有必要挖去之前的距离,即距离都是从先前城市开始记起,这是从现实出发我们也能想到的。啰嗦了一堆,附上代码 #include<stdio.h> #include<iostream> #include<queue> #include<map> using namespace std; map<int,string>M; struct Node{ int x; string name; friend bool operator<(Node a,Node b){ if(a.x!=b.x) return a.x>b.x; else return a.name>b.name; } }; priority_queue<Node>Q; map<int,string>::iterator it; const int INF = 1000000000; const int maxn = 31; void floyd(int n,int map[][maxn],int dist[][maxn],int pre[][maxn]) { int i,j,k; for(i=0;i<n;i++) { for(j=0;j<n;j++) { dist[i][j]=map[i][j]; pre[i][j]=i; } } for(k=0;k<n;k++) for(i=0;i<n;i++) for(j=0;j<n;j++) if(dist[i][k]!=INF&&dist[k][j]!=INF&&dist[i][j]>dist[i][k]+dist[k][j]){ dist[i][j]=dist[i][k]+dist[k][j]; pre[i][j]=pre[k][j]; dist[j][i]=dist[j][k]+dist[k][i]; pre[j][i]=pre[k][i]; } } int main() { int n,m,k,s; int x,y; int t; Node p; double tmp; char name[20]; int map[maxn][maxn]; int dist[maxn][maxn]; int pre[maxn][maxn]; scanf("%d",&t); while(t--) { scanf("%d%d%d",&n,&m,&k); for(int i=0;i<n;i++) for(int j=0;j<n;j++) { if(i==j) map[i][j]=0; else map[i][j]=INF; } while(m--) { scanf("%d%d%lf",&x,&y,&tmp); map[x][y]=(int)(tmp*100+0.01); map[y][x]=(int)(tmp*100+0.01); } floyd(n,map,dist,pre); while(k--) { scanf("%d %s",&x,name); M[x]=name; } scanf("%d",&s); while(s--) { scanf("%d%d%lf",&x,&y,&tmp); for(int i=0;i<n;i++) { if(dist[y][i]!=INF&&i!=x){ if(dist[x][i]!=INF){ if(dist[x][i]<dist[y][i]+dist[x][y]) continue; } it=M.find(i); if(it!=M.end()){ p.x=(dist[y][i]+50+dist[x][y]-(int)(tmp*100+0.01))/100; p.name=it->second; Q.push(p); } } } while(!Q.empty()) { Node front =Q.top(); cout<<front.name; for(int j=0;j<20-front.name.length();j++) cout<<" "; cout<<front.x<<endl; Q.pop(); } if(s) printf("\n"); } M.clear(); if(t) printf("\n"); } return 0; }
相关文章推荐
- zoj3195 树上三点的最短距离
- zoj 3195 Design the city 【LCA转RMQ】 【求三点最短距离】
- ZOJ 1082 (最短路径 Floyed)
- hdu 4323 Magic Number (最短编辑距离)
- HDU 2083 简易版之最短距离
- EASY_PAT_ZJU_1046 求循环数字公路中两个出口的最短距离
- 单词变换距离 Word Ladder (图的最短路径)
- ZOJ 3166题解 最短路径之Floyd算法
- 关于已知两点经纬度求球面最短距离的公式推导
- ZOJ 2760 How Many Shortest Path(最短路径+最大流)
- STL-ZOJ-2829 Beautiful Number:打表的艺术&&map映照容器
- 两数组最短距离
- [LeetCode]Word Ladder 最短距离字符串转换 (Dijkstra)
- 工厂分布距离最短
- ZOJ 1221 Risk(最短路径Dijkstra和Floyd算法)
- zoj 3203 Light Bulb(几何求距离)
- hdu 6097 Mindis(圆上一点到圆内(距圆心相等的)两点的距离和最短)
- A1046 Shortest Distance 最短距离
- hdu 1217 Arbitrage(floyd 每对顶点间的“最短距离”)
- 最短路径(Dijikstra和Floyed)