ccf 2017 12 4行車路線

2021-08-26 15:04:55 字數 1943 閱讀 4984

dijkstra變形,注意點:

1. 雖然題目說最終答案不會超過 10^6,但是中間過程可能超int啊…超了以後溢位變小,可能會影響到最後的解….所以還是乖乖用long long 儲存吧…

2. 圖的話…一定要考慮重邊和反向邊!!!

還是只有70分….看到網上直接用sum[i]記錄以當前小路為結尾的前面的連續小路之和,發現自己用了兩個陣列記錄…又做繁了….懶得改了…

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define iter(i,start,end) for(int (i)=(start),(i)<(end);(i)++)

#define ll long long

#define pii pair

using

namespace

std;

struct cmp ;};

const

int nodemax=500;

const

int edgemax=pow(10,5);

const ll inf=1e18;

int n,m;

vector

edges;

vector

g[nodemax];

ll d[nodemax][2];

int p[nodemax][2]; //前繼節點

bool vis[nodemax];

int before[nodemax]; //這個點的d[i][0]之前有幾個小路

void init();

void addedge(int a,int b,int c,ll d );

void solve();

int main()

return0;}

void solve()

d[0][0]=d[0][1]=0;

p[0][0]=p[0][1]=-1; //第乙個節點

memset(vis,0,sizeof(vis));

priority_queuevector

,greater> q;

q.push(pii(0,0));

while(q.size())

//第二種情況:之前也是小路

ll xiaolu=0;

int par=curnode; //如果無法往前追溯的話 父節點就是當前的節點

for(int j=0;jint now=par;

par=p[par][type];

for(int k=0;kif(edges[g[par][k]].u==now && edges[g[par][k]].type) //找到和父節點相鄰的那條邊 確定是小路的話

}xiaolu+=wei;

ll temp=d[par][0]+pow(xiaolu,2);

if(d[u][type]>temp) //相等的情況下預設是走大路划算!

}else}}

}}

cout

<1][0],d[n-1][1])}void addedge(int from ,int to ,int type,ll wei)

}if(i==g[from].size()) //不是重複邊

for(i=0;iif(edges[g[to][i]].u==from &&edges[g[to][i]].type==type)

}if(i==g[to].size())

}

CCF 201712 4 行車路線

思路 用兩個陣列維護到達某個點的最小大路距離和最小小路距離,注意結果中間過程可能爆int,不加long long 只有70分。有一種特殊情況就是通過走兩次大路,消除連續的小路值,這裡就是用兩個陣列維護的原因。include using namespace std const int maxn 100...

CCF201712 4 行車路線

一 題目大意 問題描述 小明和小芳出去鄉村玩,小明負責開車,小芳來導航。小芳將可能的道路分為大道和小道。大道比較好走,每走1公里小明會增加1的疲勞度。小道不好走,如果連續走小道,小明的疲勞值會快速增加,連續走 s公里小明會增加 s2的疲勞度。例如 有5個路口,1號路口到2號路口為小道,2號路口到3號...

ccf 201712 4 行車路線

試題編號 201712 4 試題名稱 行車路線 時間限制 1.0s 記憶體限制 256.0mb 問題描述 問題描述 小明和小芳出去鄉村玩,小明負責開車,小芳來導航。小芳將可能的道路分為大道和小道。大道比較好走,每走1公里小明會增加1的疲勞度。小道不好走,如果連續走小道,小明的疲勞值會快速增加,連續走...