P1629 邮递员送信

 注意:题目说了,所有道路单行

所以了两次迪杰斯特拉

#include <bits/stdc++.h>
using namespace std;
const int nn = 1e3 + 5;
const int mm = 1e5 + 5;
int d[nn],head[nn],ver[mm],edge[mm],nxt[mm],tot;
bool v[nn];
int n,m;
typedef pair<int,int> p;
priority_queue<p,vector<p>,greater<p> >  que;
int ans;

struct node{
    int x,y,z;
}e[mm];

void add(int x,int y,int z){
    ver[++tot] = y;edge[tot] = z;//这条边的终点和边权
    nxt[tot] = head[x];head[x] = tot;//相当于指针
}
void dijstra(){
    memset(v,0, sizeof(v));
    memset(d,0x3f,sizeof(d));
    d[1] = 0;
    que.push(make_pair(0,1));

    while(!que.empty()){
        int x = que.top().second;//表示节点编号
        que.pop();
        if(v[x]) continue;
        v[x] = 1;
        //遍历所有出边
        for(int i = head[x];i;i=nxt[i]){
            int y = ver[i],z = edge[i];
            if(d[y] > d[x] + z){
                d[y] = d[x] + z;
                que.push(make_pair(d[y],y));
            }
        }
    }

}
int main(){
   // freopen("in","r",stdin);
    ios::sync_with_stdio(0);
    cin >> n >> m ;
    for(int i = 0; i < m; i++){
        cin >> e[i].x >> e[i].y >> e[i].z;
        add(e[i].x,e[i].y,e[i].z);
    }
    dijstra();
    for(int i = 2; i <= n; i++)
        ans += d[i];

    tot = 0;
    memset(head,0, sizeof(head));
    memset(ver,0, sizeof(ver));
    memset(nxt,0, sizeof(nxt));
    for(int i = 0; i < m; i++){
        add(e[i].y,e[i].x,e[i].z);
    }
    dijstra();
    for(int i = 2; i <= n; i++)
        ans += d[i];
    cout <<  ans << endl;
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/xcfxcf/p/12817618.html