小明和小芳出去鄉村玩,小明負責開車,小芳來導航。
小芳將可能的道路分為大道和小道。大道比較好走,每走1公里小明會增加1的疲勞度。小道不好走,如果連續走小道,小明的疲勞值會快速增加,連續走
s公里小明會增加
s2的疲勞度。
例如:有5個路口,1號路口到2號路口為小道,2號路口到3號路口為小道,3號路口到4號路口為大道,4號路口到5號路口為小道,相鄰路口之間的距離都是2公里。如果小明從1號路口到5號路口,則總疲勞值為(2+2)
2+2+2
2=16+2+4=22。
現在小芳拿到了地圖,請幫助她規劃乙個開車的路線,使得按這個路線開車小明的疲勞度最小。
輸入格式
輸入的第一行包含兩個整數
n, m,分別表示路口的數量和道路的數量。路口由1至
n編號,小明需要開車從1號路口到
n號路口。
接下來m行描述道路,每行包含四個整數
t, a,
b, c,表示一條型別為
t,連線
a與 b兩個路口,長度為
c公里的雙向道路。其中
t為0表示大道,
t為1表示小道。保證1號路口和
n號路口是連通的。
輸出格式
輸出乙個整數,表示最優路線下小明的疲勞度。
樣例輸入
6 7
1 1 2 3
1 2 3 2
0 1 3 30
0 3 4 20
0 4 5 30
1 3 5 6
1 5 6 1
樣例輸出
76樣例說明
從1走小道到2,再走小道到3,疲勞度為5
2=25;然後從3走大道經過4到達5,疲勞度為20+30=50;最後從5走小道到6,疲勞度為1。總共為76。
資料規模和約定
對於30%的評測用例,1 ≤
n ≤ 8,1 ≤
m ≤ 10;
對於另外20%的評測用例,不存在小道;
對於另外20%的評測用例,所有的小道不相交;
對於所有評測用例,1 ≤ n ≤ 500,1 ≤ m ≤ 105,1 ≤ a, b ≤ n,t是0或1,c
≤ 105。保證答案不超過106。
dij演算法變形
在模板算權值的時候 加入小道判斷 如果是小道 則diss = dist[u] - small*small + (small + len)*(small + len)
small為 通過small小道長度走到點u,len為 u到v的距離
#include #include #include #include #include #includeusing namespace std;
const int maxn = 20005;
const int maxm = 200000;
const int inf = 0x3f3f3f3f;
int tot, head[maxn], n;
struct edge
e[maxm * 2];
void init()
void addedge(int u, int v, int len,int size)
; head[u] = tot++;
}struct node
a[20005];
struct dnode
};bool vis[maxn];
long long dist[maxn];
long long dij(int st, int en)
); dist[st] = 0;
int ans = -1;
while (!que.empty())
que.pop();
if (vis[u])
continue;
vis[u] = 1;
for (int i = head[u]; i != -1; i = e[i].next));}
}//和模板不同在於多了 else中的判斷小道還是大路
else );}}
} }if (ans == en)return dist[ans];
else return -1;
}int main()
cout << dij(1, n) << endl;
} return 0;
}
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 2017 12 4行車路線
dijkstra變形,注意點 1.雖然題目說最終答案不會超過 10 6,但是中間過程可能超int啊 超了以後溢位變小,可能會影響到最後的解 所以還是乖乖用long long 儲存吧 2.圖的話 一定要考慮重邊和反向邊 還是只有70分 看到網上直接用sum i 記錄以當前小路為結尾的前面的連續小路之和...