poj 1062 最短路

来源:互联网 发布:win10 eclipse java 编辑:程序博客网 时间:2024/06/07 12:38
////  main.cpp//  poj1062////  Created by Fangpin on 15/6/10.//  Copyright (c) 2015年 FangPin. All rights reserved.//#include <iostream>#include <cstdio>#include <cstring>#include <vector>const int inf=0x6f6f6f6f;using namespace std;struct Edge{    int from,to,dist;};vector<Edge> edge1,edge2;struct Data{    int price,level;};vector<Data> data;int d[500],low,high,n;int bf(){    for(int i=0;i<n;++i){        bool flag=false;        for(int j=0;j<edge2.size();++j){            Edge &e=edge2[j];            if(d[e.to]>d[e.from]+e.dist){                d[e.to]=d[e.from]+e.dist;                flag=true;            }        }        if(!flag) break;    }    int ans=inf;    for(int i=0;i<n;++i){//        cout<<i<<" "<<d[i]<<" "<<d[i]+data[i].price<<endl;        ans=min(ans,d[i]+data[i].price);    }//        ans=min(ans,d[i]);    return ans;}int main(int argc, const char * argv[]) {    int m;    while(~scanf("%d%d",&m,&n)){        data.clear();        edge1.clear();        edge2.clear();        int king_level;        for(int i=0;i<n;++i){            Data tem;            int x;            scanf("%d%d%d",&tem.price,&tem.level,&x);            if(!i) king_level=tem.level;            data.push_back(tem);            while(x--){                int to,dist;                scanf("%d%d",&to,&dist);                Edge e;                e.from=i;e.to=to-1;e.dist=dist;                edge1.push_back(e);            }        }        low=king_level;high=low+m;        int ans=inf;//        edge2=edge1;//        for(int i=0;i<edge2.size();++i)//            cout<<"edge "<<edge2[i].from<<" "<<edge2[i].to<<" "<<edge2[i].dist<<endl;//        memset(d,inf,sizeof(d));//        d[0]=0;//        ans=min(ans,bf());        while(high>=king_level){            edge2.clear();            memset(d,inf,sizeof(d));            d[0]=0;            for(int i=0;i<edge1.size();++i){                const Edge &e=edge1[i];                int x=data[e.from].level,y=data[e.to].level;                if(x>=low && x<=high && y>=low && y<=high){                    edge2.push_back(e);                }            }            ans=min(ans,bf());            --low;            --high;        }        cout<<ans<<endl;    }    return 0;}

0 0
原创粉丝点击