程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> zadd grade2 200 item3

zadd grade2 200 item3

編輯:C++入門知識

很明顯的單源點最短路問題。這個題目我的做法是直接套用spfa算法,這個算法比較好,並且能處理邊的權值是負數的情況。這個題目趕腳有點像結構體排序,如果這個距離小於當前距離修改一下,如果相等則判斷花費的大小關系即可。這種題目其實就是模板題。

[cpp]  <SPAN style="FONT-SIZE: 18px">#include<iostream> 
#include<stdio.h>  
#include<queue>  
#include<cstring>  
using namespace std; 
struct node{ 
    int start; 
    int end; 
    int money; 
    int len; 
    int next; 
}; 
node edge[100005]; 
int list[1005]; 
int dist[1005]; 
bool vis[1005]; 
int fee[1005]; 
int tot,n,m,s,t; 
void add(int a,int b,int c,int d) 

    tot=tot+1; 
    edge[tot].start=a; 
    edge[tot].end=b; 
    edge[tot].len=c; 
    edge[tot].money=d; 
    edge[tot].next=list[a]; 
    list[a]=tot; 

void spfa() 

    queue<int> q; 
    int i,l,now,j,b; 
    memset(vis,false,sizeof(vis)); 
    memset(dist,-1,sizeof(dist)); 
    memset(fee,0,sizeof(fee)); 
    vis[s]=true; 
    dist[s]=0; 
    q.push(s); 
    while(!q.empty()) 
    { 
        now=q.front(); 
        q.pop(); 
        vis[now]=false; 
        for(i=list[now];i!=-1;i=edge[i].next) 
        { 
            b=edge[i].end; 
            if(dist[b]==-1||dist[b]>dist[now]+edge[i].len) 
            { 
                dist[b]=dist[now]+edge[i].len; 
                fee[b]=fee[now]+edge[i].money; 
                if(!vis[b]) 
                { 
                    vis[b]=true; 
                    q.push(b); 
                } 
            } 
            else if(dist[b]==dist[now]+edge[i].len&&fee[b]>fee[now]+edge[i].money) 
            { 
                fee[b]=fee[now]+edge[i].money; 
                if(!vis[b]) 
                { 
                    vis[b]=true; 
                    q.push(b); 
                } 
            } 
        } 
    } 

int main() 

    int i,a,b,c,d; 
    while(cin>>n>>m) 
    { 
        if(n==0&&m==0) 
            break; 
        tot=0; 
        memset(list,-1,sizeof(list)); 
        for(i=1;i<=m;i++) 
        { 
            scanf("%d%d%d%d",&a,&b,&c,&d); 
            add(a,b,c,d); 
            add(b,a,c,d); 
        } 
        scanf("%d%d",&s,&t); 
        spfa(); 
        cout<<dist[t]<<" "<<fee[t]<<endl; 
    } 
    return 0; 

</SPAN> 

#include<iostream>
#include<stdio.h>
#include<queue>
#include<cstring>
using namespace std;
struct node{
 int start;
 int end;
 int money;
 int len;
 int next;
};
node edge[100005];
int list[1005];
int dist[1005];
bool vis[1005];
int fee[1005];
int tot,n,m,s,t;
void add(int a,int b,int c,int d)
{
 tot=tot+1;
 edge[tot].start=a;
 edge[tot].end=b;
 edge[tot].len=c;
 edge[tot].money=d;
 edge[tot].next=list[a];
 list[a]=tot;
}
void spfa()
{
 queue<int> q;
 int i,l,now,j,b;
 memset(vis,false,sizeof(vis));
 memset(dist,-1,sizeof(dist));
 memset(fee,0,sizeof(fee));
 vis[s]=true;
 dist[s]=0;
 q.push(s);
 while(!q.empty())
 {
  now=q.front();
  q.pop();
  vis[now]=false;
  for(i=list[now];i!=-1;i=edge[i].next)
  {
   b=edge[i].end;
   if(dist[b]==-1||dist[b]>dist[now]+edge[i].len)
   {
    dist[b]=dist[now]+edge[i].len;
    fee[b]=fee[now]+edge[i].money;
    if(!vis[b])
    {
     vis[b]=true;
     q.push(b);
    }
   }
   else if(dist[b]==dist[now]+edge[i].len&&fee[b]>fee[now]+edge[i].money)
   {
    fee[b]=fee[now]+edge[i].money;
    if(!vis[b])
    {
     vis[b]=true;
     q.push(b);
    }
   }
  }
 }
}
int main()
{
 int i,a,b,c,d;
 while(cin>>n>>m)
 {
  if(n==0&&m==0)
   break;
  tot=0;
  memset(list,-1,sizeof(list));
  for(i=1;i<=m;i++)
  {
   scanf("%d%d%d%d",&a,&b,&c,&d);
   add(a,b,c,d);
   add(b,a,c,d);
  }
  scanf("%d%d",&s,&t);
  spfa();
  cout<<dist[t]<<" "<<fee[t]<<endl;
 }
 return 0;
}

 


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved