题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2066
自己真是弱啊。。难度只有一星的模板题都想了一段时间。。本来以为是多源的,用flody算法做更好,但是1000^3的flody很明显会超时。。于是一直想怎么改造flody算法。后来突然想到用单源的做反而并不会超时。。。真为智商捉急。。于是用了迪杰斯特拉算法来做。
代码如下:
#include <stdio.h> #include <string.h> int n, m, map[1002][1002], d[1002], vis[1002], maxint=1000000, nn; void dijk(int s) { int i,j, min1,pos; for(i=1;i<=nn;i++) d[i]=map[s][i]; vis[s]=1; d[s]=0; for(i=1;i<nn;i++) { min1=maxint; for(j=1;j<=nn;j++) { if(!vis[j]&&min1>d[j]) { min1=d[j]; pos=j; } } vis[pos]=1; for(j=1;j<=nn;j++) { if(d[j]>map[pos][j]+d[pos]) d[j]=map[pos][j]+d[pos]; } } } int main() { int t, a, b, c, p[1000],q[1000], min1, min2, s, i, j; while(scanf("%d%d%d",&t,&n,&m)!=EOF) { min2=maxint; nn=0; for(i=0;i<=1001;i++) { for(j=0;j<=1001;j++) { map[i][j]=maxint; } } while(t--) { scanf("%d%d%d",&a,&b,&c); if(nn<a) nn=a; if(nn<b) nn=b; if(map[a][b]>c) { map[a][b]=map[b][a]=c; } } for(i=0;i<n;i++) scanf("%d",&p[i]); for(i=0;i<m;i++) scanf("%d",&q[i]); for(i=0;i<n;i++) { memset(vis,0,sizeof(vis)); dijk(p[i]); min1=maxint; for(j=0;j<m;j++) { if(min1>d[q[j]]) min1=d[q[j]]; } if(min2>min1) min2=min1; } printf("%d\n",min2); } return 0; }