九度OJ 1008

#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <bitset>
#include <map>
#include <queue>
using namespace std;
vector<vector<int> > len(1001,  vector<int>(1001));
vector<vector<int> > cost(1001,  vector<int>(1001));
vector<int> distD(1001);
vector<int> distP(1001);
map<int, vector<int> > vertex;
bitset<1001> visit;
queue<int> q;
void findPath(int n, int start)
{
    visit.reset();
    vector<int>::iterator iter = vertex[start].begin();
    for(; iter != vertex[start].end(); ++iter)
    {
        distD[*iter] = len[start][*iter];
        distP[*iter] = cost[start][*iter];
        visit.set(*iter);
        q.push(*iter);
    }
    visit.set(start);
    distD[start] = 0;
    while(!q.empty())
    {
       int min = 100000000;
       int i = q.front();
       q.pop();
       vector<int>::iterator it = vertex[i].begin();
       for(; it != vertex[i].end(); ++it)
       {
           min = 100000000;
           if(!visit[*it])
           {
               for(vector<int>::iterator iter2 = vertex[*it].begin(); iter2 != vertex[*it].end(); ++iter2)
               {
                   if(visit[*iter2] && distD[*iter2] + len[*it][*iter2] < min)
                   {
 min = distD[*iter2] + len[*it][*iter2];
                       distD[*it] = min;
                       distP[*it] = distP[*iter2] + cost[*it][*iter2];
                   }
                   else if(visit[*iter2] && distD[*iter2] + len[*it][*iter2] == min)
                   {
                       if(distP[*it] > distP[*iter2] + cost[*it][*iter2])
                           distP[*it] = distP[*iter2] + cost[*it][*iter2];
                   }
               }
               visit.set(*it);
               q.push(*it);
           }
       }
    }
}
int main()
{
    //freopen("1.txt", "r", stdin);
    int n, m;
    while(cin >> n >> m,  m * n != 0)
    {
        len.clear();
        cost.clear();
        distD.clear();
        distP.clear();
        vertex.clear();
        len.resize(1001);
        cost.resize(1001);
        distD.resize(1001);
        distP.resize(1001);
        for(int i = 0; i < 1001; ++i)
 {
            len[i].resize(1001);
            cost[i].resize(1001);
        }
        for(int i = 0; i < 1001; ++i)
            for(int j = 0; j < 1001; ++j)
            {
                len[i][j] = 0;
                cost[i][j] = 0;
            }
        for(int i = 0; i < m; ++i)
        {
            int a, b, d, p;
            cin >> a >> b >> d >> p;
            vertex[a].push_back(b);
            vertex[b].push_back(a);
            len[a][b] = len[b][a] = d;
            cost[a][b] = cost[b][a] = p;
        }
        int start, end;
        cin >> start >> end;
        findPath(n, start);
        cout << distD[end] << " " << distP[end] << endl;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值