HDOJ_1142 最短路 迪杰斯特拉+广搜
本题的基本思路是想地杰斯特拉找出最短路,然后用广搜找出有多少个路
这个题很让人崩溃,刚开始一直runtime error 搞得我一头雾水,高了半天,我map初始化的语句该做条件表达式就过了,不解
今天大奔又弄个runtime error 问我类,我昨天在自己的电脑上交了,回头他交不了,我愣了愣,后来才发现得用c++提交,依然无解
#include<stdio.h> #include<string.h> #define MAX 1000010 //#define MAX_1 1001 int map[1001][1001],dis[1001]; int res[1001]; int n,m; bool visit[1001]; void dijkstra(int k) { int u,i,j,min,x; for(i=1;i<=n;++i) { visit[i]=false; dis[i]=map[2][i]; } visit[2]=true; if(min==MAX) return ; for(i=2;i<=n;++i) { min=MAX; for(j=1;j<=n;++j) { if(!visit[j]&&min>dis[j]) { u=j; min=dis[j]; } } visit[u]=true; for(x=1;x<=n;++x) { if(!visit[x]&&dis[x]>dis[u]+map[x][u]) { dis[x]=dis[u]+map[x][u]; } } } } int find(int v) { int i; if(res[v]!=-1) return res[v]; if(v==2) return 1; res[v]=0; for(i=1;i<=n;++i) { if(map[i][v]!=MAX && dis[i]<dis[v]) res[v]+=find(i); } return res[v]; } int main() { int i,j,a,b,value; while(scanf("%d",&n)!=EOF&&n) { scanf("%d",&m); for(i=1;i<=n;++i) for(j=1;j<=n;++j) { map[i][j]=MAX; map[i][j] = i == j ? 0 : MAX; } for(i=1;i<=m;++i) { scanf("%d%d%d",&a,&b,&value); map[a][b]=map[b][a]=value; } dijkstra(2); memset(res,-1,sizeof(res)); printf("%d\n",find(1)); } return 0; }