您的位置:首页 > 其它

hdu 3790 双权值最短路径

2015-10-02 17:28 501 查看
      只需要考虑最短路就好了,用dijkstra求最短路过程中只搜索了一条最短路,而本题只要在最短路相同时再比较花费谁最小就行了。对dijkstra做一点改动即可。

      PS:有重边,输入时要做些处理。

代码如下:

#include <cstdio>
#include <stack>
#include <set>
#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <list>
#include <functional>
#include <cstring>
#include <algorithm>
#include <cctype>
#include <string>
#include <map>
#include <iomanip>
#include <cmath>
#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 pair<int, int> pii;
typedef pair<int, string> pis;
int n,m,g

,val

,d
,value
;
bool vis
;
void dij(int s,int e)
{
int i,j;
for (i=1;i<=n;i++) value[i]= d[i]=INF;
d[s]=0;
value[s]=0;
MS(vis,false);
for (i=1;i<n;i++) {
int v,mn=INF;
for (j=1;j<=n;j++) if (!vis[j] && d[j]<mn) mn=d[v=j];
vis[v]=true;
for (j=1;j<=n;j++) if (!vis[j] && g[v][j]<INF) {
if ( d[j]>d[v]+g[v][j] || (d[j]==d[v]+g[v][j] && value[j]>value[v]+val[v][j]) ) { // 求最短路径或最短路径相同时花费最小的路径
d[j]=d[v]+g[v][j];
value[j]=value[v]+val[v][j];
}
}
}
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<m;i++) {
int a,b,x,y;
scanf("%d%d%d%d",&a,&b,&x,&y);
if (x<g[a][b] || (x==g[a][b] && y<val[a][b]) ) {
g[a][b]=g[b][a]=x;
val[a][b]=val[b][a]=y;
}
}
int s,e;
scanf("%d%d",&s,&e);
dij(s,e);
}
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: