poj1724 ROADS

題目的意思:給出一定的錢,從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;
}



 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章