HDU 1596 find the safest road dijkstra&&SPFA
2015-08-18 10:21
417 查看
find the safest road
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 9368 Accepted Submission(s): 3308
[align=left]Problem Description[/align]
XX星球有很多城市,每个城市之间有一条或多条飞行通道,但是并不是所有的路都是很安全的,每一条路有一个安全系数s,s是在 0 和 1 间的实数(包括0,1),一条从u 到 v 的通道P 的安全度为Safe(P) = s(e1)*s(e2)…*s(ek) e1,e2,ek是P 上的边 ,现在8600 想出去旅游,面对这这么多的路,他想找一条最安全的路。但是8600 的数学不好,想请你帮忙 ^_^
[align=left]Input[/align]
输入包括多个测试实例,每个实例包括:
第一行:n。n表示城市的个数n<=1000;
接着是一个n*n的矩阵表示两个城市之间的安全系数,(0可以理解为那两个城市之间没有直接的通道)
接着是Q个8600要旅游的路线,每行有两个数字,表示8600所在的城市和要去的城市
[align=left]Output[/align]
如果86无法达到他的目的地,输出"What a pity!",
其他的输出这两个城市之间的最安全道路的安全系数,保留三位小数。
[align=left]Sample Input[/align]
3 1 0.5 0.5 0.5 1 0.4 0.5 0.4 1 3 1 2 2 3 1 3
[align=left]Sample Output[/align]
0.500 0.400 0.500
[align=left]Author[/align]
ailyanlu
[align=left]Source[/align]
HDU 2007-Spring Programming Contest - Warm Up (1)
SPFA
#include<stdio.h> #include<string.h> #include<queue> #include<algorithm> using namespace std; #define INF 0x3f3f3f3f int m,n; int cnt; double d[10010]; int vis[10010]; int head[1000010]; int used[10100]; struct s { int u,v,next; double w; }; s edge[1000010]; void add(int u,int v,double w) { edge[cnt].u=u; edge[cnt].v=v; edge[cnt].w=w; edge[cnt].next=head[u]; head[u]=cnt++; } void SPFA(int s) { queue<int>q; memset(vis,0,sizeof(vis)); memset(d,0,sizeof(d)); memset(used,0,sizeof(used)); d[s]=1; vis[s]=1; q.push(s); while(!q.empty()) { int u=q.front(); q.pop(); vis[u]=0; for(int i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].v; if(d[v]<d[u]*edge[i].w) { d[v]=d[u]*edge[i].w; if(!vis[v]) { vis[v]=1; q.push(v); used[v]++; if(used[v]>n) return ; } } } } } int main() { int a,b; while(scanf("%d%",&n)!=EOF) { cnt=0; double yy; memset(head,-1,sizeof(head)); int i,j; for(i=1;i<=n;i++) for(j=1;j<=n;j++) { scanf("%lf",&yy); add(i,j,yy); } scanf("%d",&m); for(i=1;i<=m;i++) { scanf("%d%d",&a,&b); if(a==b) {printf("1.000\n"); continue ; } SPFA(a); if(d[b]>0) printf("%0.3lf\n",d[b]); else printf("What a pity!\n"); } } return 0; }
dijkstra
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define INF 0x3f3f3f3f #define max(a,b) a>b?a:b int n; bool used[1010]; double cost[1010][1010]; double mp[1010][1010]; double d[1010]; void dijkstra(int s) { int i,j,v; for(i=1;i<=n;i++) { d[i]=0; used[i]=false; } d[s]=1; //相乘的运算 while(true) { v=-1; for(int u=1;u<=n;u++) if(!used[u]&&(v==-1||d[u]>d[v])) v=u; if(v==-1) break; used[v]=true; for(int u=1;u<=n;u++) d[u]=max(d[u],d[v]*cost[v][u]); } } int main() { int i,j,m,a,b; while(scanf("%d",&n)!=EOF) { for(i=1;i<=n;i++) for(j=1;j<=n;j++) scanf("%lf",&cost[i][j]); scanf("%d",&m); while(m--) { scanf("%d%d",&a,&b); dijkstra(a); if(d[b]>0) printf("%0.3lf\n",d[b]); else printf("What a pity!\n"); } } return 0; }
相关文章推荐
- javascript入门笔记(1)——变量和计算
- javascript中的面向对象(1)
- POJ 2718 Smallest Difference
- 问题:table 可否实现对角线;结果:用div+css模拟表格对角线
- BufferImage 与imagezh整理归纳
- EmberJs之数组绑定@each&[]
- Jquery动画第一部分
- CSS3展现精彩的动画效果 css3的动画属性
- 基于Jquery的原生态dialog弹出窗口-zapWindow
- jQuery学习二
- 阿里笔试16前端布局
- 控制文本和外观------CSS Binding(CSS类名绑定)
- jQuery学习一
- jquery animate 动画效果使用说明
- CSS选择器及用法
- JS+DIV+CSS实现仿表单下拉列表效果
- html table设置边框线
- CSS中属性position位置详解功能讲解与实例分析
- js 小数取整的函数
- CSS中绝对定位解释