Sicily. Walk This Way

来源:互联网 发布:linux vi 复制整行 编辑:程序博客网 时间:2024/04/28 01:30

在这道题中用了个小技巧,根据是否能乘车来判断距离,若能乘车,则距离为0,不能则为dis


代码如下



#include <iostream>#include <stack>#include <cstdio>#include <queue>#include <vector>#include <algorithm>#include <iomanip>#include <cstring>using namespace std;const int maxn = 10001;int dis[101][101];bool vis[101];int minDis[101];int main(){int tst;scanf("%d", &tst);while(tst--){int n, m;int c1, c2, d, bus;int start, end;scanf("%d%d", &n, &m);//initializefor(int i = 0; i < 101; i++){vis[i] = false;for(int j = 0; j < 101; j++)dis[i][j] = maxn;}//record the mapfor(int i = 0; i < m; i++){scanf("%d%d%d%d", &c1, &c2, &d, &bus);dis[c1][c2] = (bus == 1)?0:d;dis[c2][c1] = (bus == 1)?0:d;}scanf("%d%d", &start, &end);//Dijkstrafor(int i = 0; i < n; i++)minDis[i] = dis[start][i];vis[start] = true;for(int i = 1; i < n; i++){int tempDis = maxn;int nextPoint;for(int k = 0; k < n; k++){if(tempDis > minDis[k] && !vis[k]){tempDis = minDis[k];nextPoint = k;}}vis[nextPoint] = true;//updatefor(int k = 0; k < n; k++){if(minDis[k] > dis[nextPoint][k] + tempDis && !vis[k])minDis[k] = dis[nextPoint][k] + tempDis;}}printf(vis[end]?"%d\n":"-1\n", minDis[end]);}return 0;}


0 0