ZOJ 2504 Help John! (dijkstra)

我感觉这个题的叙述有问题。

 

john他妈给他说了一条路线,但是他想走更短的。但是他走出去的第一条路必须是她妈说的,剩下的就随便走了。

他如果找不到可以到达的路的话,就输出N。

 

数据也很弱,我的程序漏洞百出也能过。

 

#include<stdio.h> #include<math.h> const int INF = 99999990; int t,n,r,w,m; int from,to,now; int mat[1001][1001]; int mo[30001]; int dist[1001],flag[1001]; int i,j,k,start = 1; int sumself,summo,min; int main(void) { scanf("%d",&t); for(k = 1; k <= t; k++ ) { scanf("%d%d",&n,&r); for(i = 1; i <= n; i++ ) //初始化 { dist[i] = INF; flag[i] = 0;//把0写成1了,wa死了 for( j = 1; j <= n;j++ ) mat[i][j]=INF; } for(i = 1; i <= r; i++ ) //输入矩阵 { scanf("%d%d%d",&from,&to,&w); mat[from][to] = mat[to][from] = w; } scanf("%d",&m); //他妈给的路线长度 for( i = 1; i <= m; i++ ) scanf("%d",&mo[i]); for( i = 1,summo = 0; i < m; i++ ) summo += mat[ mo[i] ][ mo[i+1] ]; dist[mo[2]] = mat[1][mo[2]]; //从第二个到n点的最短路径 flag[now = mo[2]] = 1; flag[1] = 1; for ( i = 2; i < n; ++ i ) { for( j = 2; j <= n; ++ j ) if ( !flag[j] && dist[j] > dist[now] + mat[now][j] ) dist[j] = dist[now] + mat[now][j]; for( j = 2,min = INF; j <= n; j++ ) if ( !flag[ j ] && min > dist[j] ) min = dist[ now=j ]; flag[now] = 1; } sumself = dist[n]; printf("TEST %d ",start++); if( sumself == INF ) printf("N/n"); else printf("Y %d/n",summo-sumself); } return 0; }

你可能感兴趣的:(ZOJ 2504 Help John! (dijkstra))