zoj3946 Highway Project

K. Highway Project
t->測試數據組
n,m->n個點,m條可建邊
x,y,d,c->x與y有可以建邊,經過此邊爲d 時間,建邊需c費用

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const int N=100005;
const ll inf=1e12;

struct node{
  int v;
  ll dist,cost;
  node(int _v,ll _dist,ll _cost){
     v=_v;
     dist=_dist;
     cost=_cost;
  }
  bool operator < (const node& p) const{
      return dist>p.dist;
  }
};


vector <node> v[N];
priority_queue <node>q;
bool vis[N];
ll dis[N],cost[N];

void dijkstra(int n,int s){
   for(int i=0;i<n;i++){
    dis[i]=inf;
    cost[i]=inf;
   }
   while(!q.empty()) q.pop();
   q.push(node(0,0,0));
   dis[0]=0;
   cost[0]=0;
   while(!q.empty()){
        node p=q.top();
        q.pop();
        if(vis[p.v]) continue;
        vis[p.v]=1;
       // cout<<p.v<<" "<<p.dist<<" "<<p.cost<<endl;
        for(int i=0;i<v[p.v].size();i++){
                node pp=v[p.v][i];
                int to=pp.v;
                int _dis=pp.dist;
                //cout<<dis[p.v]<<endl;
              //  cout<<p.v<<" "<<pp.v<<" "<<pp.dist<<" "<<pp.cost<<endl;
            if(dis[to]>dis[p.v]+_dis){
                dis[to]=dis[p.v]+_dis;
                cost[to]=pp.cost;
                q.push(node(to,dis[to],cost[to]));
            }else if(dis[to]==dis[p.v]+_dis&&cost[to]>pp.cost){
                //pp.dist=p.dist+_dis;
                cost[to]=pp.cost;
                q.push(node(to,dis[to],cost[to]));
            }
        }
   }
    ll ans1=0,ans2=0;
   for(int i=0;i<n;i++){
       ans1+=dis[i];
       ans2+=cost[i];
     // cout<<dis[i]<<endl;
   }
   cout<<ans1<<" "<<ans2<<endl;
}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--){
        int n,m;
        scanf("%d%d",&n,&m);
        int x,y,d,c;
        memset(v,0,(n+1)*sizeof v[0]);
        memset(vis,false,sizeof vis);
        for(int i=0;i<m;i++){
            scanf("%d%d%d%d",&x,&y,&d,&c);
            v[x].push_back(node(y,d,c));
            v[y].push_back(node(x,d,c));
        }
        dijkstra(n,0);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章