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 |
我也是那个的变种,不知道是不是错了,DIJ结构不变,然后每次寻找在X集合中到Y集合中最长的边,再更新DIST(如果COST[V][W]>DIST[W] 那么更新DIST) 谁可以教教我这样做对不对? 程序如下: #include <stdio.h> #include <memory.h> #include <string.h> #define true 1 #define false 0 #define I -9999 int cost[200][20]; int dist[200]; int v0,v1; int Teams=0,Index[200]; char Name[200][100]; int GetID(char *NowName) { int i,j,k,b; i = -1;j = Teams; while (i < j-1) { k = (i+j)/2; b = strcmp(Name[Index[k]],NowName); if (!b) { return Index[k]; } if (b>0) { j=k; } else { i=k; } } for (i=Teams;i>j;i--) { Index[i]=Index[i-1]; } Index[j]=Teams; strcpy(Name[Teams],NowName); Teams++; return Teams-1; } void main() { int final[200], i,j, v, v1,w,max,min,d,n,m,num=0; char name[200],start[100],end[100]; int x,y,distance,load[100]; while(1) { num++; scanf("%d%d", &n,&m); if(n==0&&m==0)break; memset(load,0,sizeof(int)*n); for(i = 0; i < m; i++) { scanf("%s",name); x=GetID(name); scanf("%s", name); y=GetID(name); scanf("%d", &distance); cost[x][y]=distance; cost[y][x]=distance; } scanf("%s %s",start,end); d=GetID(end); v0=GetID(start); for(i=0;i<n;i++) for(j=0;j<n;j++) { if(cost[i][j]==0)cost[i][j]=I; } for (v = 0; v < n; v++) { final[v] = false; dist[v] = cost[v0][v]; } final[v0] = true; load[v0]=-I; v=v0; for(i=1;i<n;i++) { max = I; v1=v; for (w=0;w<n;w++) { if (!final[w]&&dist[w]>max) { max=dist[w]; v=w; } } final[v]=true; if(max<load[v1])load[v]=max; else load[v]=load[v1]; for (w=0;w<n;w++) { if(!final[w]&&(cost[v][w]>dist[w])) { dist[w]=cost[v][w]; } } } printf("Scenerio #%d\n",num); printf("%d tons\n\n",load[d]); } } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator