1010 problem J
来源:互联网 发布:淘宝订单业务流程 编辑:程序博客网 时间:2024/06/05 18:57
题意:
大概就是从A到B最短的距离确定,但是有几条路不确定,让你求有几条最短路。
思路:
求出最短路保存起来,遍历一遍数一下
#include<stdio.h>#include<string.h>#include<iostream>using namespace std;#define MAXN 1005int cost[MAXN][MAXN];int dis[MAXN];int sum[MAXN];#define INF 0x3f3f3f3f #define typec int int path[MAXN],vis[MAXN];void Dijkstra(typec cost[][MAXN],typec lowcost[MAXN],int n,int beg){ int i,j; typec minc; memset(vis,0,sizeof(vis)); vis[beg]=1; for(i=1;i<=n;i++) { lowcost[i]=cost[beg][i];path[i]=beg; } lowcost[beg]=0; path[beg]=-1; int pre; for(int num=2;num<n;num++) { minc=INF; for(j=1;j<=n;j++) if(vis[j]==0&&lowcost[j]<minc) {pre=j;minc=lowcost[j];} if(minc>=INF)break; vis[pre]=1; for(j=1;j<=n;j++) if(vis[j]==0&&lowcost[pre]+cost[pre][j]<lowcost[j]) {lowcost[j]=lowcost[pre]+cost[pre][j];path[j]=pre;} }}int dfs(int i,int n){ if(i==2) return 1; if(sum[i]!=-1) return sum[i]; int cnt=0; for(int j=1;j<=n;j++) { if(cost[i][j]<INF&&dis[j]<dis[i]) cnt+=dfs(j,n); } sum[i]=cnt; return sum[i];}int main(){ int i,j; int n,m; int a,b,d; while(cin>>n&&n) { cin>>m; for(i=1;i<=n;i++) for(j=1;j<=n;j++) { if(i==j)cost[i][j]=0; else cost[i][j]=INF; } while(m--) { cin>>a>>b>>d; cost[a][b]=d; cost[b][a]=d; } Dijkstra(cost,dis,n,2); memset(sum,-1,sizeof(sum)); cout<<dfs(1,n)<<endl; }}
0 0
- 1010 Problem J
- 1010 Problem J
- 1010 problem J
- 1010 Problem J
- Problem J
- Problem J
- Problem J
- Problem-J
- Problem J
- Problem-J
- Problem J
- problem j
- Problem D & Problem J
- 课程练习三-1010-Problem J
- Philip J. Fry Problem
- Problem J: Scholarship
- 专题三 Problem J
- 动态规划 problem J
- NoSQL之Redis---持久化(persistence)示例
- Javascript DOM Event对象方法详解
- numpy 备忘录
- U盘超级加密3000
- c#下出现“”未处理System.BadImageFormatException“错误
- 1010 problem J
- iOS 人脸识别(检测)
- prewitt边缘检测原理
- Activity横竖屏切换时的生命周期
- 学生信息管理系统
- WebView的加载
- xlistview
- 06main
- 数据库的分库分表