| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
太坑爹了,spfa+邻接表,怎么还超时啊,跪求各路大神帮忙,在线等#include <stdio.h>
#include <stdlib.h>
#define MAX 1000010
#define LEN 2000020
typedef struct eadge eadge_t;
struct eadge
{
long stop;
long distance;
eadge_t* next;
};
eadge_t out_eadges[MAX];
eadge_t in_eadges[MAX];
void init_link();
void free_link();
void insert_link(eadge_t* root, eadge_t* et);
long val[MAX];
long queue[LEN];
long head, tail;
void Insert(long num);
long Get();
long Is_Empty();
long Find(long num);
void Ini(long p);
int main(void)
{
long n, p, q, i, num, sour, dest, distance;
long long result;
eadge_t* et = NULL;
scanf("%d", &n);
while(n --)
{
scanf("%ld%ld", &p, &q);
init_link();
for(i = 0; i < q; i ++)
{
scanf("%ld%ld%ld", &sour, &dest, &distance);
et = (eadge_t*)malloc(sizeof(eadge_t));
et->stop = dest;
et->distance = distance;
et->next = NULL;
insert_link(&out_eadges[sour], et);
et = (eadge_t*)malloc(sizeof(eadge_t));
et->stop = sour;
et->distance = distance;
et->next = NULL;
insert_link(&in_eadges[dest], et);
}
Ini(p);
Insert(1);
while(!Is_Empty())
{
num = Get();
et = out_eadges[num].next;
while(et != NULL)
{
if(val[et->stop] > val[num] + et->distance)
{
val[et->stop] = val[num] + et->distance;
if(!Find(et->stop))
Insert(et->stop);
}
et = et->next;
}
}
for(i = 1, result = 0; i < p + 1; i ++)
result += val[i];
Ini(p);
Insert(1);
while(!Is_Empty())
{
num = Get();
et = in_eadges[num].next;
while(et != NULL)
{
if(val[et->stop] > val[num] + et->distance)
{
val[et->stop] = val[num] + et->distance;
if(!Find(et->stop))
Insert(et->stop);
}
et = et->next;
}
}
for(i = 1; i < p + 1; i ++)
result += val[i];
printf("%lld\n", result);
free_link();
}
return 0;
}
void init_link()
{
long i = 0;
for(i = 1; i < MAX; i ++)
{
out_eadges[i].next = NULL;
in_eadges[i].next = NULL;
}
}
void free_link()
{
long i = 0;
eadge_t* tem = NULL;
for(i = 1; i < MAX; i ++)
{
eadge_t* et = in_eadges[i].next;
while(et != NULL)
{
tem = et;
et = et->next;
free(tem);
}
et = out_eadges[i].next;
while(et != NULL)
{
tem = et;
et = et->next;
free(tem);
}
}
}
void insert_link(eadge_t* root, eadge_t* et)
{
eadge_t* pt = root;
while(pt->next != NULL)
pt = pt->next;
pt->next = et;
et->next = NULL;
}
void Insert(long num)
{
queue[tail] = num;
tail = (tail + 1) % LEN;
}
long Get()
{
long tem = head;
head = (head + 1) % LEN;
return queue[tem];
}
long Is_Empty()
{
if(tail == head)
return 1;
return 0;
}
long Find(long num)
{
int i = 0;
for(i = head; i != tail; i = (i + 1) % LEN)
{
if(queue[i] == num)
return 1;
}
return 0;
}
void Ini(long p)
{
long i = 0;
val[1] = 0;
for(i = 2; i < p + 1; i ++)
val[i] = 1000000001;
head = 0;
tail = 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator