标签:mit size 等级 color sizeof style ems output ted
http://poj.org/problem?id=1062
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 50705 | Accepted: 15183 |
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
Source
一开始想在结点直接保存最小最大值然后判断下一个节点的范围是否在M内,但一直WA。
后来发现可以枚举一下最大点的等级,(一条路线上总有一个最大等级点)这样就得到了一个范围,将不在此范围内的点全部标记不再访问即可,但要注意初始化d时不能赋为inf否则WA。
一开始的错误竟然是vis[0]忘记每次赋值为零,醉了。
1 #include<iostream> 2 #include<cstdio> 3 #include<queue> 4 #include<cmath> 5 #include<cstring> 6 using namespace std; 7 #define inf 0x3f3f3f3f 8 int P[105],L[105],e[105][105],first[110],cnt; 9 bool vis[110]; 10 int dij(int N) 11 { 12 int d[110]; 13 memset(d,inf,sizeof(d)); 14 d[0]=0; 15 for(int i=0;i<=N;++i) 16 { 17 int u=0,minv=inf; 18 for(int j=1;j<=N;++j) if(!vis[j]&&d[j]<minv) minv=d[u=j]; 19 vis[u]=1; 20 for(int j=1;j<=N;++j) if(!vis[j]&&d[j]>d[u]+e[u][j]) d[j]=d[u]+e[u][j]; 21 } 22 return d[1]; 23 } 24 int main() 25 { 26 int N,M,i,j,k; 27 while(cin>>M>>N){ 28 int n,from,w; 29 memset(e,inf,sizeof(e)); e[0][0]=0; 30 for(i=1;i<=N;++i) 31 { 32 e[i][i]=0; 33 cin>>P[i]>>L[i]>>n; 34 e[0][i]=P[i]; 35 while(n--){ 36 cin>>from>>w; 37 e[from][i]=w; 38 } 39 } 40 int ans=inf; 41 for(i=1;i<=N;++i) 42 { 43 int high=L[i]; 44 for(j=1;j<=N;++j) 45 { 46 if(L[j]>high||high-L[j]>M) vis[j]=1; 47 else vis[j]=0; 48 } 49 vis[0]=0; 50 ans=min(ans,dij(N)); 51 } 52 cout<<ans<<endl; 53 } 54 return 0; 55 }
标签:mit size 等级 color sizeof style ems output ted
原文地址:http://www.cnblogs.com/zzqc/p/7364358.html