只需要考慮最短路就好了,用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之間有一條邊,且其長...