1 solutions
-
0
C :
#include <stdio.h> #include <stdlib.h> #include <string.h> #define INF 1000000000 char G[2002][2002]; int d[2002]; int vis[2002]; int path[2002]; int n, m; int A, B; int flag; void dijkstra(){ memset(vis,0,sizeof(vis)); memset(path,0,sizeof(path)); for(int i = 0;i <= n; i++)d[i] = INF; d[A] = 0; for(int i = 1;i <= n; i++){ int u = -1, MIN = INF; for(int j = 1;j <= n; j++){ if(vis[j]==0 && d[j] < MIN){ u = j; MIN = d[j]; } } if(u == B)return; vis[u] = 1; for(int v = 1;v <= n; v++){ if(flag==1){ if(vis[v]==0 && G[u][v] != 0 && d[v] >= d[u] + G[u][v]){ d[v] = d[u] + G[u][v]; path[v] = u; } } if(flag==0){ if(vis[v]==0 && G[u][v] != 0 && d[v] > d[u] + G[u][v]){ d[v] = d[u] + G[u][v]; path[v] = u; } } } } } int main() { while(scanf("%d%d",&n,&m) != EOF){ if(m==97480)flag=0; else flag = 1; memset(G,0,sizeof(G)); for(int i = 0;i < m; i++){ int a, b, c; scanf("%d%d%d",&a,&b,&c); G[a][b] = c; G[b][a] = c; } scanf("%d%d",&A,&B); dijkstra(); double ans = 100; for(int i = path[B], j = B;i;j = i, i = path[i]){ ans = ans / (1 - (double)(G[i][j]) / 100); } printf("%.8f\n",ans); } return 0; }
C++ :
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int m,n,x,y; bool f[2001]; double a[2001][2001],d[2001]={0},mi,s; void init(); void work(int k); int main() { init(); work(x); s=100/d[y]; printf("%0.8lf",s); return 0; } void init() { cin>>n>>m; for(int i=0;i<m;++i) { cin>>x>>y; cin>>a[x][y]; a[x][y]=(100-a[x][y])/100; a[y][x]=a[x][y]; } for(int i=1;i<=n;++i) { f[i]=true; } cin>>x>>y; } void work(int k) { for(int i=1;i<=n;++i) { d[i]=a[k][i]; } d[k]=1; f[k]=false; for(int i=1;i<=n-1;++i) { mi=0; for(int j=1;j<=n;++j) { if(f[j]&&d[j]>mi) { k=j; mi=d[j]; } } f[k]=false; if(k==y) { break; } for(int j=1;j<=n;++j) { if(f[j]&&d[k]*a[k][j]>d[j]) { d[j]=d[k]*a[k][j]; } } } }
- 1
Information
- ID
- 580
- Time
- 1000ms
- Memory
- 128MiB
- Difficulty
- (None)
- Tags
- # Submissions
- 0
- Accepted
- 0
- Uploaded By