poj1724 ROADS

来源:互联网 发布:36氪网站源码 编辑:程序博客网 时间:2024/05/22 00:08

题目的意思:给出一定的钱,从1到N,每走一条路径都需要一定的花费,问从1到N在花费不超过的情况下,最短路径。

 这题可以用深搜来做,也可以用dijkstra的优先队列来做

深搜的方法:

#include<stdio.h> #include<string.h> #include<stdlib.h> int K , N , E ; int min_distance ; int curdistance ,curcost; bool visit[105]  ; int head[105] , t ; struct node {      int u , v , d , w ;      int next ; }Adjlist[100005] ; void CreateGraph (int K , int N , int E ) {      int u , v , d , w  ;      memset(head , 0 , sizeof(head) ) ; //init      t = 1 ;      while ( E-- )      {           scanf("%d%d%d%d" , &u , &v , &d , &w ) ;           Adjlist[t].u = u ;           Adjlist[t].v = v ;           Adjlist[t].d = d;           Adjlist[t].w = w ;           Adjlist[t].next = head[u] ;           head[u] = t++ ;      } } void dfs ( int u  ) {      if ( curcost > K || (curdistance >=min_distance)  )                return  ;      if ( u == N  )      {           min_distance = curdistance ;           return ;      }    for (int i = head[u] ; i  ; i = Adjlist[i].next )           if ( ! visit[Adjlist[i].v]  )           {                   visit[Adjlist[i].v] = true ;                curdistance+= Adjlist[i].d;                curcost+=Adjlist[i].w;                dfs ( Adjlist[i].v  ) ;                visit[Adjlist[i].v] = false ;                curdistance-= Adjlist[i].d;                curcost-=Adjlist[i].w;           } } int main () {      //freopen("a.txt","r",stdin);      //int test ;      //scanf("%d" , &test ) ;      //while ( test -- )      //{           scanf("%d%d%d" , &K , &N , &E ) ;           CreateGraph ( K , N , E ) ;           min_distance = 2000000000  ;           memset ( visit , false , sizeof(visit) ) ;           curdistance=0;           curcost=0;           visit[1]=true;           dfs( 1 ) ;           if ( min_distance != 2000000000 )                printf("%d\n" , min_distance );           else                printf("-1\n");      //}      return  0 ; } 


dijkstra的优先队列:

#include<stdio.h>#include<string.h>#include<queue>using namespace std;struct Map{    int next;int v;int w;    int len;    int coins;}map[100005];//邻表int head[105];struct Node{    int a;    int len;    int coins;    bool operator < (const Node &b) const    {        if(len==b.len) return coins>b.coins;        return len>b.len;    }}start,temp,tex;priority_queue<Node>Q;int K,N,M;int dijkstra(int k){    int i;    start.a=map[k].v;    start.len=0;    start.coins=0;    Q.push(start);    while(!Q.empty())    {        temp=Q.top();        Q.pop();        if(temp.a==N)return temp.len;//寻找到目标结点        for(i=head[temp.a];i;i=map[i].next)if(temp.coins+map[i].coins<=K){tex.a=map[i].w;tex.len=temp.len+map[i].len;tex.coins=temp.coins+map[i].coins;Q.push(tex);}    }    return -1;}int main(){//freopen("aa.txt","r",stdin);    int a,b,l,va,t,i,k,p;//scanf("%d",&t);//while(t--)//{memset(head,0,sizeof(head));scanf("%d%d%d",&K,&N,&M);p=1;for(i=1;i<=M;i++){scanf("%d%d%d%d",&a,&b,&l,&va);//建立邻接表if(a==1)k=p;map[p].v=a;map[p].w=b;map[p].len=l;map[p].coins=va;map[p].next=head[a];head[a]=p;p++;}printf("%d\n",dijkstra(k));//}    return 0;}


 

 

 

原创粉丝点击