【POJ】1062 昂贵的聘礼 (最短路)

题目

传送门:QWQ

分析

最短路显然,但不好搞地位等级。。。。。

地位等级不好搞?那么就暴力。。

枚举我们允许的地位等级,跑最短路。

所以$ n^2logn $出100什么鬼啊,很有迷惑性啊

 还有4篇cf没补博客好慌啊

代码

细节不少,WA了好几发

//#include <bits/stdc++.h>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
const int maxn=1200, INF=1e9;
struct Edge{
    int u,v,dis;
};
vector<Edge> edges; vector<int> G[maxn];
void Addedge(int u,int v,int dis){
    edges.push_back((Edge){u,v,dis}); G[u].push_back(edges.size()-1);
}
int l[maxn], L, R, val[maxn];
struct HeapNode{
    int x,dis;
    bool operator < (const HeapNode& a) const{ return dis>a.dis; }
};
priority_queue<HeapNode> que;
int d[maxn],vis[maxn], n;
int dijkstra(int s ){
    if(l[s]<L || l[s]>R) return val[s];
    memset(d,127,sizeof(d)); memset(vis,0,sizeof(vis));
    d[s]=0; que.push((HeapNode){s,0}); //vis[s]=1;
    while(!que.empty()){
        HeapNode x=que.top(); que.pop();
        if(vis[x.x]) continue; vis[x.x]=1;
        int u=x.x;
        for(int i=0;i<G[u].size();i++){
            Edge& e=edges[G[u][i]];
            if(l[e.v]>=L && l[e.v]<=R && d[e.v]>d[u]+e.dis){
                d[e.v]=d[u]+e.dis;
                que.push((HeapNode){e.v,d[e.v]}); 
            }
        }
    } 
    int ans=1e9;
    for(int i=1;i<=n;i++){
        ans=min(ans,d[i]+val[i]);
    }
    return ans;
}
int main(){
    int  m; scanf("%d%d",&m,&n);
    int x, q=0,b,c;
    for(int i=1;i<=n;i++){
        scanf("%d%d%d",&val[i],&l[i],&x);
        while(x--){
            scanf("%d%d",&b,&c); Addedge(i,b,c);
        }
        q=max(q,l[i]);
    }
    int ans=INF;
    for(int i=1;i<=max(q-m,n);i++){
        L=i; R=i+m;
        ans=min(ans,dijkstra(1)); 
    }
    printf("%d\n",ans);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/noblex/p/9271577.html