hdu 3790 雙權值最短路徑

2021-07-05 13:37:16 字數 1615 閱讀 1222

只需要考慮最短路就好了,用dijkstra求最短路過程中只搜尋了一條最短路,而本題只要在最短路相同時再比較花費誰最小就行了。對dijkstra做一點改動即可。

ps:有重邊,輸入時要做些處理。

**如下:

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define ll long long

#define ull unsigned long long

#define sz(x) (int)x.size()

#define mp(a, b) make_pair(a, b)

#define ms(arr, num) memset(arr, num, sizeof(arr))

#define pb push_back

#define f first

#define s second

#define rop freopen("input.txt", "r", stdin);

#define mid(a, b) (a + ((b - a) >> 1))

#define lson l,mid,rt<<1

#define rson mid+1,r,rt<<1|1

#define lrt rt << 1

#define rrt rt << 1|1

#define root 1,n,1

#define bitcount(x) __builtin_popcount(x)

#define bitcountll(x) __builtin_popcountll(x)

#define leftpos(x) 32 - __builtin_clz(x) - 1

#define leftposll(x) 64 - __builtin_clzll(x) - 1

const double pi = acos(-1.0);

const int inf = 0x7fffffff;

using namespace std;

const double eps = 1e-5;

const int maxn = 300 + 10;

const int mod = 1000007;

const int n=1100;

const int max=log2(n*1.0);

typedef pairpii;

typedef pairpis;

int n,m,g[n][n],val[n][n],d[n],value[n];

bool vis[n];

void dij(int s,int e)}}

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

}int main()

{ int i,j;

while(~scanf("%d%d",&n,&m),n)

{for (i=1;i<=n;i++)

for (j=1;j<=n;j++) g[i][j]=val[i][j]=inf;

for (i=0;i

HDU 3790 最短路徑問題(雙重權值)

problem description 給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。input 輸入n,m,點的編號是1 n,然後是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其長...

HDU3790(最短路徑)

題意 給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。解題思路 這是最短路問題的變形,以前做的只是求兩點之間的最短距離,現在除了距離最短,在此基礎上增加了花費最少。用弗洛伊德演算法同樣可以求解。注意 ...

HDU 3790 最短路徑問題(多權最短路)

problem description 給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。input 輸入n,m,點的編號是1 n,然後是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其長...