M

来源:互联网 发布:飞翔打印软件免费版 编辑:程序博客网 时间:2024/04/29 05:17

Think:
1知识点:最短路_spfa()算法+区间移动
2思考:通过知识扩展思路,敢于尝试,善于借鉴,一定要有自己的思想与创新点

vjudge题目链接

建议参考博客

以下为Accepted代码

#include <cstdio>#include <cstring>#include <algorithm>#include <queue>using namespace std;const int inf = 0x3f3f3f3f;const int N = 1e2 + 4;int n, m, e[N][N], dis[N], vis[N], lev[N];void spfa(int l, int r);int main(){    int i, j, p, k, u, w, ans;    while(~scanf("%d %d", &m, &n)){        ans = inf;        memset(e, inf, sizeof(e));        for(i = 1; i <= n; i++){            scanf("%d %d %d", &p, &lev[i], &k);            e[0][i] = p;/*模拟入队预处理,使得初始状态全部入队,进而更新*/            for(j = 1; j <= k; j++){                scanf("%d %d", &u, &w);                e[u][i] = w;            }        }        for(i = 0; i <= m; i++){/*区间移动寻找最优解*/            spfa(lev[1]-i, lev[1]+m-i);            ans = min(ans, dis[1]);        }        printf("%d\n", ans);    }    return 0;}void spfa(int l, int r){    queue <int> q;    while(!q.empty()){        q.pop();    }    memset(dis, inf, sizeof(dis));    memset(vis, 0, sizeof(vis));    dis[0] = 0, vis[0] = 1;    q.push(0);    while(!q.empty()){        int t1 = q.front();        q.pop();        vis[t1] = 0;        for(int i = 1; i <= n; i++){            if(lev[i] < l || lev[i] > r)                continue;            if(dis[t1] + e[t1][i] < dis[i]){                dis[i] = dis[t1] + e[t1][i];                if(!vis[i]){                    vis[i] = 1;                    q.push(i);                }            }        }    }}
原创粉丝点击