1 条题解
-
0
C++ :
#include <cstdio> #include <cstring> #include <queue> using namespace std; struct Edge{ int v,w,nx; }; Edge edge[100001]; int headlist[101],n,m,st,en,q,b,t,a,map[101][101]={0}; double ans[101][101],dx[101][1001]; struct Point{ int id,sw; }; queue<Point> que;bool ex[101][1001]={0}; Point in,temp; void spfa() { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) dx[i][j]=100000000.0; dx[st][0]=0; in.id=st; in.sw=0; que.push(in); while(!que.empty()) { in=que.front(); que.pop();ex[in.id][in.sw]=0; for(int i=headlist[in.id];i!=-1;i=edge[i].nx) { if(dx[edge[i].v][in.sw+1]>dx[in.id][in.sw]+edge[i].w) { dx[edge[i].v][in.sw+1]=dx[in.id][in.sw]+edge[i].w; if(!ex[edge[i].v][in.sw+1]) { ex[edge[i].v][in.sw+1]=1; temp.id=edge[i].v; temp.sw=in.sw+1; que.push(temp); } } } } for(int i=1;i<=n;i++) { if(st==i) continue; double min=100000000.0; for(int j=1;j<=n;j++) { if(dx[i][j]!=100000000.0&&dx[i][j]/(double)j<min) { min=dx[i][j]/(double)j; } } if(min!=100000000.0) ans[st][i]=min; else ans[st][i]=-1; } } int main() { //freopen("path.in","r",stdin); //freopen("path.out","w",stdout); memset(headlist,-1,sizeof(headlist)); memset(ans,127,sizeof(ans)); scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { scanf("%d%d%d",&a,&b,&t); if(map[a][b]==0||t<map[a][b]) { map[a][b]=t; edge[i].v=b; edge[i].nx=headlist[a]; edge[i].w=t; headlist[a]=i; } } for(int i=1;i<=n;i++) { st=i; spfa(); } scanf("%d",&q); for(int i=1;i<=q;i++) { scanf("%d%d",&st,&en); if(ans[st][en]==-1) printf("OMG!\n"); else printf("%.3lf\n",(double)((int)(ans[st][en]*1000+0.5))/1000); } return 0; }
- 1
信息
- ID
- 1575
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者