Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
恳请高手帮忙!!!想了很久,还是WA,大家能帮忙看一下吗? #include <stdio.h> //单源最短路径,dijkstra算法,邻接阵形式,复杂度O(n^2) //求出源s到所有点的最短路经,传入图的顶点数n,(有向)邻接矩阵mat //返回到各点最短距离min[] //可更改路权类型,但必须非负! #define MAXN 100 #define inf 10001 struct thing { int p, l, x; }a[100]; void dijkstra(int n,int mat[][MAXN],int s,int* min){ int v[MAXN],i,j,k; for (i=0;i<n;i++) min[i]=inf,v[i]=0; for (min[s]=0,j=0;j<n;j++){ for (k=-1,i=0;i<n;i++) if (!v[i]&&(k==-1||min[i]<min[k])) k=i; for (v[k]=1,i=0;i<n;i++) if (!v[i]&&min[k]+mat[k][i]<min[i]) { min[i]=min[k]+mat[k][i]; } } //在已求最短距离上加上节点的价值 for(i=0; i<n; i++) min[i] += a[i].p; } int main(void) { int M=0, N=0, i=0, j=0; int t[100], v[100]; int price[100][100]; scanf("%d%d", &M, &N); int *min = new int[N]; for(i=0; i<N; i++) for(j=0; j<N; j++) price[i][j] = inf; for(i=0; i<N; i++) { scanf("%d%d%d", &a[i].p, &a[i].l, &a[i].x); for(j=0; j<a[i].x; j++) { scanf("%d%d", &t[j], &v[j]); price[i][t[j]-1] = v[j]; } } //求最大等级的位置 int MaxLev=0, index=0; for(i=0; i<N; i++) { if(a[i].l > MaxLev) { MaxLev = a[i].l; index = i; } } //将超过M的去掉,用inf表示去掉 for(j=0; j<N; j++) { if((a[index].l-a[j].l) > M) { for(int k=0; k<N; k++) { price[k][j] = inf; price[j][k] = inf; } } } dijkstra(N, price, 0, min); int Min = 10001; for(i=0; i<N; i++) if(min[i] < Min) Min = min[i]; printf("%d", Min); delete []min; return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator