Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 31623 | Accepted: 8930 |
Description
Input
Output
Sample Input
1 4 10000 3 2 2 8000 3 5000 1000 2 1 4 200 3000 2 1 4 200 50 2 0
Sample Output
5250
最短路的题!很好做用个Dijkstra就OK了
#include<stdio.h> #include<cstring> #include<iostream> #include<cmath> using namespace std; int edge[105][105],visit[105],dist[105],rank[105]; #define inf 0xfffffff int m,n; void init(int n) { int i,j; for(i=0;i<=n+1;i++) for(j=0;j<=n+1;j++) { if(i==j) edge[i][j]=0; else edge[i][j]=inf; } } int dijkstr(int v0) { int i,j,k,min,u; for(i=0;i<=n+1;i++) { dist[i]=edge[v0][i]; } visit[v0]=1; dist[v0]=0; for(i=0;i<n;i++) { min=inf;u=v0; for(j=1;j<=n;j++) { if(!visit[j]&&dist[j]<min) { u=j; min=dist[j]; } } // printf("\n %d ",u); visit[u]=1; for(k=1;k<=n;k++) { if(!visit[k] && edge[u][k]<inf&& (dist[u]+edge[u][k]<dist[k])) { dist[k]=dist[u]+edge[u][k]; // printf("%d\n",dist[k]); } } } return dist[1]; } int main () { int i,p,x,t,v,j,re,r,max1,min1,maxlv; while(scanf("%d%d",&m,&n)!=EOF) { init(n); for(i=1;i<=n;i++) { scanf("%d%d%d",&p,&rank[i],&x); edge[0][i]=p; while(x--) { scanf("%d%d",&t,&v); edge[t][i]=v; } } re=inf; for(i=1;i<=n;i++) { max1=rank[i];min1=rank[i]; memset(visit,0,sizeof(visit)); for(j=1;j<=n;j++) { if(fabs(max1-rank[j])>m||fabs(min1-rank[j])>m) { visit[j]=1; // printf(" %d ",j); } else { if(rank[j]>max1) { max1=rank[j]; } if(rank[j]<min1) {min1=rank[j];} visit[j]=0; } } /* maxlv=rank[i]; //把当前物品的等级暂时看做最高等级 for(int j=1;j<=n;j++) //遍历其他各点 { if(rank[j]>maxlv || maxlv-rank[j]>m) //当其它物品j的等级比当前物品高(保证单向性),或者两者等级之差超出限制M时 visit[j]=1; //物品j则强制定义为“已访问”状态,不参与后续操作 else visit[j]=0; //否则物品j定义为“未访问”状态,参与后续操作 } } */ r=dijkstr(0); // printf("%d\n",r); if(r<re) re=r; } printf("%d\n",re); } return 0; }