POJ 1511(dijkstra)

poj1511

题意:有向图,

求:1到n的最短路和n到1的最短路。

思路:裸体,这题卡scanf注意下。和POJ3268差不多

#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <string>
#include <map>
#include <iomanip>
#include <algorithm>
#include <queue>
#include <stack>
#include <set>
#include <vector>
//const int maxn = 1e5+5;
#define ll long long
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
//const int inf = 0x6fffffff;

#define MAX INT_MAX
#define FOR(i,a,b) for( int i = a;i <= b;++i)
#define bug cout<<"--------------"<<endl
using namespace std;
ll ver1[1010000],edge1[1010000],edge2[1010000],ver2[1010000],next1[1010000],next2[1010000],head1[1010000],head2[1010000];
ll vis[1010000],d1[1010000],d2[1010000];
ll n,T,m,tot1,tot2;
void add1(ll x,ll y,ll z)
{
    ver1[++tot1] = y,edge1[tot1] = z,next1[tot1] = head1[x] , head1[x] = tot1;
}
void add2(ll x,ll y,ll z)
{
    ver2[++tot2] = y,edge2[tot2] = z,next2[tot2] = head2[x] , head2[x] = tot2;
}
void dijistra1()
{
    priority_queue<pair<ll,ll> >que;
    memset(vis,0,sizeof(vis));
    memset(d1,1001000000,sizeof(d1));
    d1[1] = 0;
    que.push(make_pair(0,1));
    while(que.size())
    {
        int x = que.top().second;que.pop();
        if(vis[x] == 1) continue;
        vis[x] = 1;
        for(int i=head1[x] ; i ;i=next1[i])
        {
            int y = ver1[i];
            ll z = edge1[i];
            if(d1[y] > d1[x] + z)
            {
                d1[y] = d1[x] + z;
                que.push(make_pair(-d1[y],y));
            }
        }
    }
}
void dijistra2()
{
    priority_queue<pair<int,int> >que;
    memset(vis,0,sizeof(vis));
    memset(d2,1001000000,sizeof(d2));
    d2[1] = 0;
    que.push(make_pair(0,1));
    while(que.size())
    {
        int x = que.top().second;que.pop();
        if(vis[x] == 1) continue;
        vis[x] = 1;
        for(int i=head2[x] ; i ;i=next2[i])
        {
            int y = ver2[i];
            ll z = edge2[i];
            if(d2[y] > d2[x] + z)
            {
                d2[y] = d2[x] + z;
                que.push(make_pair(-d2[y],y));
            }
        }
    }
}

int main()
{

    //ios::sync_with_stdio(false);
    scanf("%lld",&T);
    while(T--)
    {
        tot1 = 0;
        tot2 = 0;
        memset(head1,0,sizeof(head1));
        memset(head2,0,sizeof(head2));
        //cin>>n>>m;
        scanf("%lld %lld",&n,&m);
        while(m--)
        {
            ll a,b,z;
            scanf("%lld %lld %lld",&a,&b,&z);
            add1(a,b,z);
            add2(b,a,z);
        }
        dijistra1();
        dijistra2();
        ll ans = 0;
        for(int i=1;i<=n;++i)
        {
            ans+=d1[i]+d2[i];
        }
        printf("%lld\n",ans);
    }
}

 

posted @ 2019-08-17 23:39  阿斯水生产线  阅读(167)  评论(0编辑  收藏  举报