POJ 1724 ROADS

    技术2025-05-28  19

    http://www.oeddyo.com/dijkstra%E5%8F%98%E5%BD%A2-poj-1724-poj-3635/

     

    还是优先队列+BFS

     

    用一个节点记录到达当前城市经过的距离和花费,如果加上到它周边城市的花费不超过限制,则加入到优先队列中

     

    根据dijkstra的原理,这样的距离是最短距离

     

    代码:

    #include<iostream> #include<queue> using namespace std; const int MAX=105; const int inf=1<<30; struct node { int v,d,c,next; bool operator <(const node &a) const { return a.d<d; } }g[MAX*MAX]; int n,k,e,dis[MAX],adj[MAX]; priority_queue<node>que; int solve() { struct node cur; struct node next; cur.d=0; cur.v=1; cur.c=0; que.push(cur); while(!que.empty()) { cur=que.top(); que.pop(); int cu=cur.v; int cw=cur.d; int cc=cur.c; //dis[cu]=cw; //cout<<cu<<" "<<cw<<" "<<cc<<endl; if(cu==n)//优先队列中还有cu的其他状态节点,d值比最小值大(未完全更新) //如果这时不退出,就不对了 return cw; for(int i=adj[cu];i!=-1;i=g[i].next) { if(cc+g[i].c<=k) { next.v=g[i].v; next.c=cc+g[i].c; next.d=cw+g[i].d; que.push(next); } } } return -1; } int main() { int i,j,l,r,t; scanf("%d%d%d",&k,&n,&r); e=0; memset(adj,-1,sizeof(adj)); for(i=1;i<=n;i++) dis[i]=inf; dis[1]=0; while(r--) { scanf("%d%d%d%d",&i,&j,&l,&t); g[e].v=j; g[e].d=l; g[e].c=t; g[e].next=adj[i]; adj[i]=e++; } printf("%d/n",solve()); return 0; } 

    最新回复(0)