zoj 2504 Help John!(Dijkstra~~)

一星期没敲代码啦。。。哈哈。。敲起来脑子格外清晰~~

 

不过DIJ的标记忘写了,WA了几次。。。还是不熟练啊。。。笨笨。。

 

看着我的代码感觉好好~~用了函数 ,不是以前的混乱状态啦 嘻嘻 感觉很好~~

 

排名11。。。占用内存好大啊。。。

 

话说,网通开CSDN真快。。。

 

 

#include <stdio.h> #include <stdlib.h> #include <memory.h> #include <limits.h> #define N 1002 int ncases,m,n,a,b,c,k,map[N][N],count = 1,sum; int road[N],paths; void input() { int i,j; scanf("%d%d",&n,&m); for(i=1; i<=n; i++) for(j=1; j<=n; j++) map[i][j] = INT_MAX; for(i=1; i<=m; i++) { scanf("%d%d%d",&a,&b,&c); map[a][b] = c; map[b][a] = c; } scanf("%d",&k); for(i=1; i<=k; i++) scanf("%d",&road[i]); } int sumroad() { int i; sum = 0; for(i=1; i<=k-1; i++) if( map[road[i]][road[i+1]]!=INT_MAX ) sum += map[road[i]][road[i+1]]; else return 0; return 1; } void dijkstra() { int now = road[2],min,dis[N]; int hash[N],i,j; for(i=1; i<=n; i++) dis[i] = INT_MAX; memset(hash,0,n*sizeof(int)); dis[now] = map[road[1]][road[2]]; hash[now] = 1; hash[road[1]] = 1; for(i=1; i<=n; i++) { for(j=1; j<=n; j++) if( map[now][j]!=INT_MAX && dis[j] > dis[now] + map[now][j] ) dis[j] = dis[now] + map[now][j]; min = INT_MAX; for(j=2; j<=n; j++) if( dis[j] < min && !hash[j] ) { min = dis[j]; now = j; } hash[now] = 1; } paths = dis[road[k]]; } void output() { printf("TEST %d ",count++); if( paths == INT_MAX || paths > sum ) printf("N/n"); else printf("Y %d/n",sum - paths ); } int main(void) { scanf("%d",&ncases); while(ncases--) { input(); if( sumroad() ) { dijkstra(); output(); } else printf("TEST %d N/n",count++); } system("pause"); return 0; }

你可能感兴趣的:(zoj 2504 Help John!(Dijkstra~~))