逛街 最短距離 花費

2021-08-21 19:46:28 字數 2118 閱讀 5201

時間限制: 1 sec 記憶體限制: 128 mb

假設渣渣灰有乙個女朋友,他的女朋友要他陪著一起去公園。由於渣渣灰不喜歡運動,所以他想找一條最短的路到達公園。由於途中會有許多消費點,而每到乙個消費點女朋友就要購物,而渣渣灰比較摳,所以假如有多條最短路,則他會選擇途中消費點最便宜的。給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s,終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。

輸入nm,點的編號是1~n然後是m行,每行4個數 abdp,表示a和b之間有一條邊,且其長度為d,花費為p。最後一行是兩個數 st;起點s,終點。n和m為0時輸入結束。

(1輸出 一行有兩個數, 最短距離及其花費。

2 21 2 5 10

2 1 4 12

1 24 4

1 2 5 6

2 3 4 5

1 4 5 10

4 3 4 2

1 36 7

1 2 5 6

1 3 5 1

2 6 2 1

3 4 1 1

4 2 1 1

4 5 1 1

5 2 3 1

5 60 0

4 12

9 11

4 3輸入樣例的空行只是為了讓大家分辨資料,輸入有沒有空行都沒關係。輸出樣例沒有空行。

dijkstra演算法求單源最短路簡單擴充套件,我們再建立乙個value陣列儲存花費情況。在鬆弛時對value進行改變。

鬆弛成功則value(s->i)=value(s->k->i)。

若最短路相等則對value值進行比較,即value(s->i)=min(value(s->k->i),value(s->i))。

s為源點,i為當前終點,k為中間點。最終輸出最短路及對應value值即可。

#include#define inf 0x3f3f3f3f

using namespace std;

const int maxn=1e3+10;

int n,m;

struct node

road[maxn][maxn];

int dis[maxn];//最短距離

bool vis[maxn];

int cost[maxn];//花費

void dijkstra(int s)

for(int u=1;ucost[k]+road[k][i].cs)

//if

}//for

}}int main()

}int s,t;

scanf("%d%d",&s,&t);

dijkstra(s);

printf("%d %d\n",dis[t],cost[t]);

}return 0;

}

#include #include #define inf 0x3f3f3f3f

#define min(a,b) a>b?b:a

struct node

g[1005][1005];

int dist[1005];//距離

int value[1005];//費用

int used[1005];//標記

int n,m,i,j;

void dijkstra(int s)

if(u==-1)//判斷所有頂點是否都到達過

return ;

for(i=1,k=0;i<=n;i++)

if(dist[u]==dist[i]&&used[i]==0)

d[k++]=i;//從起點到下乙個要訪問的頂點的最小距離可能有多個

for(i=0;iused[d[i]]=1;

for(i=0;ifor(j=1;j<=n;j++)

if(g[d[i]][j].adj!=inf && (dist[d[i]]+g[d[i]][j].adj)<=dist[j])

}}int main()

} int s,t;

scanf("%d%d",&s,&t);

dijkstra(s);

printf("%d %d\n",dist[t],value[t]);

} return 0;

}

1407 最短距離

兩個點 a b 均在做勻速直線運動。給出 t 0時刻 a b 的座標,以及 a b 的速度,計算t 0時兩個點的距離的最小值。輸入的第一行包含乙個整數 t 1 t 200 表示一共有 t 組測試資料。對於每組測試資料,第一行包含4個整數 x a y a v ax v ay 103 x a y a v...

編輯最短距離

給定兩個字串s和t,對於t我們允許三種操作 1 在任意位置新增任意字元 2 刪除存在的任意字元 3 修改任意字元 問最少操作多少次可以把字串t變成s?例如 s abcf t dbfg 那麼我們可以 1 把d改為a 2 刪掉g 3 加入c 所以答案是3。1 把t中字元全刪了,再新增s的全部字元,操作次...

素數最短距離問題

素數距離問題 時間限制 3000 ms 記憶體限制 65535 kb 難度 2 描述現在給出你一些數,要求你寫出乙個程式,輸出這些整數相鄰最近的素數,並輸出其相距長度。如果左右有等距離長度素數,則輸出左側的值及相應距離。如果輸入的整數本身就是素數,則輸出該素數本身,距離輸出0 輸入第一行給出測試資料...