标签:等于 替代 sizeof output 开始 最小 lang str name
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 51879 | Accepted: 15584 |
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
思路:
一开始的思路是以酋长为起点,直接求他到每个符合要求的点的最长的路径,然后遍历一遍所有点,找出优惠最大的就好了,后面发现实际写的时候很麻烦,处理起来有点麻烦。
实际这道题因为不管怎么换最后都要和酋长换,所以应该以酋长为终点,然后直接枚举所有符合题目要求的点到酋长的最短路径然后找出这些路径里面最小的就行了。
实现代码:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; #define INF 0x3f3f3f3f #define M 200 int price[M],rank[M],n,g[M][M],cnt,dist[M],vis[M],u,m,id,num; void init(){ memset(price,0,sizeof(price));memset(rank,0,sizeof(rank)); for(int i=0;i<=n;i++) for(int j=0;j<=n;j++) g[i][j] = INF; } void dij(){ for(int i=1;i<=n;i++) dist[i] = price[i]; int n1 = n; while(n1--){ int minn = INF; for(int i=1;i<=n;i++) if(dist[i]<minn&&!vis[i]) dist[u=i]; vis[u] = 1; for(int i=1;i<=n;i++){ if(!vis[i]&&dist[i]>dist[u]+g[u][i]) dist[i] = dist[u] + g[u][i]; } } } int main(){ while(scanf("%d%d",&cnt,&n)!=EOF){ init(); for(int i=1;i<=n;i++){ scanf("%d%d%d",&price[i],&rank[i],&m); for(int j=1;j<=m;j++){ scanf("%d%d",&id,&num); g[id][i] = num; } } int ans = INF; for(int i=1;i<=n;i++){ int max_rank = rank[i]; for(int j=1;j<=n;j++){ if(rank[j]<max_rank||rank[j]-max_rank>cnt) vis[j] = 1; else vis[j]=0; } dij(); ans = min(ans,dist[1]); } cout<<ans<<endl; } return 0; }
标签:等于 替代 sizeof output 开始 最小 lang str name
原文地址:http://www.cnblogs.com/kls123/p/7921631.html