hdu 3631 floyd最短路
2013-06-23 13:06
316 查看
题意:给定一张图,再给出一系列的操作,0 x表示标记x点,1 x y表示求x,y的最短路(注意,这条路径上的所有点必须都要被标记过)
解法:保存地图后,每标记一个点,就对这一个点进行松弛。
注意:
1、可能有重边,读入的时候要处理一下
2、要用longlong存map,inf设为0x3f3f3f3f是不够的
解法:保存地图后,每标记一个点,就对这一个点进行松弛。
注意:
1、可能有重边,读入的时候要处理一下
2、要用longlong存map,inf设为0x3f3f3f3f是不够的
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; long long map[305][305]; char vis[305]; #define inf 0x3f3f3f3f3f3f3f3f int main() { int n,m,q; long long c; int a,b; int cas=1; while(scanf("%d%d%d",&n,&m,&q)!=EOF) { if(n+m+q==0) break; memset(map,0x3f,sizeof(map)); memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++) map[i][i]=0; for(int i=1;i<=m;i++) { scanf("%d %d %I64d",&a,&b,&c); if(map[a][b]>c) { map[a][b]=c; } } if(cas!=1) printf("\n"); printf("Case %d:\n",cas++); for(int i=1;i<=q;i++) { scanf("%d",&a); if(a==0) { scanf("%d",&b); if(vis[b]) {printf("ERROR! At point %d\n",b);continue;} vis[b]=1; for(int j=0;j<n;j++) for(int k=0;k<n;k++) map[j][k]=min(map[j][k],map[j][b]+map[b][k]); } else if(a==1) { scanf("%d%d",&a,&b); if(!vis[a]||!vis[b]) printf("ERROR! At path %d to %d\n",a,b); else if(map[a][b]==inf) printf("No such path\n"); else printf("%I64d\n",map[a][b]); } } } return 0; }
相关文章推荐
- HDU - 3631 Shortest Path(Floyd最短路)
- HDU 2833 WuKong(floyd最短路)
- HDU-#2544 最短路(Dijkstra、Floyd、Bellman-Ford、SPFA)
- 最短路->hdu 3631 Shortest Path
- hdu 2544 最短路 (dijkstra,floyd)
- hdu 3631 Shortest Path (floyd)
- HDU-1869 最短路 FLOYD
- hdu 1874 畅通工程续 最短路 DIS 和 FLOYD
- HDU 2544-最短路(SPFA,Dijkstra,Floyd)
- hdu 2544 最短路 (dijkstra,floyd)
- hdu 1690 最短路floyd
- HDU 2544 最短路(最短路 Floyd)
- hdu 2544最短路Floyd
- 畅通工程续(hdu1874,floyd最短路)
- HDU-1874-畅通工程续(最短路,FLOYD)
- hdu 2544 最短路 Floyd || SFPA
- hdu 1874 畅通工程续(最短路floyd)
- hdu 3631 Shortest Path floyd 解题报告
- HDU 2833 WuKong 【floyd最短路 + dp】
- HDU 3631 floyd