 #include<iostream>
#include<iostream>
 #include<stdio.h>
#include<stdio.h>
 #include<stdlib.h>
#include<stdlib.h>
 #include<string.h>
#include<string.h>
 #include<ctype.h>
#include<ctype.h>
 #include<queue>
#include<queue>
 #include<list>
#include<list>
 #include<vector>
#include<vector>
 #include<cmath>
#include<cmath>
 #include<algorithm>
#include<algorithm>
 using namespace std;
using namespace std;

 #define inf 1000000001
#define inf 1000000001

 struct SNode
struct SNode


 {
{
 int to;
    int to;
 int price;
    int price;
 SNode *next;
    SNode *next;
 }forward[1000000+10],Reverse[1000000+10],storage[2000000+10];
}forward[1000000+10],Reverse[1000000+10],storage[2000000+10];

 int P,Q,allocate;
int P,Q,allocate;



 bool visited[1000000+10];
bool visited[1000000+10];
 int dist[1000000+10];
 int dist[1000000+10];


 struct cmp
struct cmp {
{

 bool operator()( int a, int b)
    bool operator()( int a, int b)

 
     {
{
 return dist[a]>dist[b];
        return dist[a]>dist[b];
 }
    }
 };
};

 priority_queue<int,vector<int>,cmp> H;
 priority_queue<int,vector<int>,cmp> H;

 void initial()
void initial()


 {
{
 for(int i=0;i<=P;i++)
    for(int i=0;i<=P;i++)
 Reverse[i].next =forward[i].next =NULL;
        Reverse[i].next =forward[i].next =NULL;
 allocate=0;
    allocate=0;
 }
}




 int dijk(SNode graph[])
int dijk(SNode graph[])


 {
{
 for(int i=0;i<=P;i++)
    for(int i=0;i<=P;i++)
 dist[i]=inf;
        dist[i]=inf;
 memset(visited,false,sizeof(visited));
    memset(visited,false,sizeof(visited));

 visited[1]=true;
    visited[1]=true;
 dist[1]=0;
    dist[1]=0;
 SNode *p=graph[1].next;
    SNode *p=graph[1].next;    
 while(!H.empty() )H.pop ();
    while(!H.empty() )H.pop ();

 while(p)
    while(p) { printf("%d     ",p->to );H.push(p->to ); dist[p->to]=p->price;p =p->next;}
{ printf("%d     ",p->to );H.push(p->to ); dist[p->to]=p->price;p =p->next;}
 int cnt=0;
    int cnt=0;

 while(!H.empty ())
    while(!H.empty ()) {printf("%d ",H.top ());H.pop ();}
{printf("%d ",H.top ());H.pop ();}

 while(!H.empty ())
    while(!H.empty ()) {
{
 int k=0;
        int k=0;

 do
        do {
{
 if(H.empty ())break;
            if(H.empty ())break;
 if(k)H.pop ();
            if(k)H.pop ();
 k=H.top ();printf("%d -----%d--\n",k,++cnt);
            k=H.top ();printf("%d -----%d--\n",k,++cnt);
 
            
 }while(visited[k] );
        }while(visited[k] );
 if(H.empty () )break;
        if(H.empty () )break;
 H.pop ();
        H.pop ();
 printf("asdfsdf\n");
        printf("asdfsdf\n");
 visited[k]=true;
        visited[k]=true;

 // relax
        // relax

 p=graph[k].next;
        p=graph[k].next;

 while(p)
        while(p) {printf("-%d- ",p->to );
{printf("-%d- ",p->to );

 if( !visited[p->to ] &&  dist[k]+p->price< dist[p->to] )
            if( !visited[p->to ] &&  dist[k]+p->price< dist[p->to] ) {
{
 
                
 dist[p->to ]= dist[k]+p->price;
                dist[p->to ]= dist[k]+p->price;
 H.push (p->to );
                H.push (p->to );
 }
            }
 p=p->next;
            p=p->next;
 }
        }
 }
    }
 int ret=0;
    int ret=0;

 for(int i=1;i<=P;i++)
    for(int i=1;i<=P;i++) {
{
 ret+=dist[i];
        ret+=dist[i];
 }
    }
 return ret;
    return ret;
 }
}



 int main()
int main()


 {
{
 int T;
    int T;
 scanf("%d",&T);
    scanf("%d",&T);

 while(T--)
    while(T--) {
{
 scanf("%d %d",&P,&Q);
        scanf("%d %d",&P,&Q);
 initial();
        initial();
 int sor,des,price;
        int sor,des,price;

 for(int i=0;i<Q;i++)
        for(int i=0;i<Q;i++) {
{
 scanf("%d %d %d",&sor,&des,&price);
            scanf("%d %d %d",&sor,&des,&price);
 // push
            // push
 SNode *p=&storage[allocate++];
            SNode *p=&storage[allocate++];
 p->to=des;
            p->to=des;
 p->price=price;
            p->price=price;
 p->next =forward[sor].next;
            p->next =forward[sor].next;
 forward[ sor].next =p;
            forward[ sor].next =p;

 SNode *q=&storage[allocate++];
            SNode *q=&storage[allocate++];
 q->to =sor;
            q->to =sor;
 q->price=price;
            q->price=price;
 q->next =Reverse[des].next;
            q->next =Reverse[des].next;
 Reverse[des].next=q;
            Reverse[des].next=q;
 }
        }
 int ans=dijk(forward);
        int ans=dijk(forward);
 ans+=dijk(Reverse);
    ans+=dijk(Reverse);
 printf("%d\n",ans);
        printf("%d\n",ans);
 }
    }
 return 0;
    return 0;
 }
}

 
            posted on 2009-07-20 21:47 
iyixiang 阅读(261) 
评论(0)  编辑 收藏 引用  所属分类: 
acm