poj3268

又犯了同样的错误,开edge数组开小了,应该是maxm,开成了maxn

正反两个图,进行两次dijkstra即可

View Code
   
     
#include < cstdio >
#include
< iostream >
#include
< cstdlib >
#include
< cstring >
using namespace std;

#define maxn 1005
#define maxm 100005
#define inf 1000000000

struct Edge
{
int v, w, next;
}edge[maxm], opedge[maxm];

int n, m, t, head[maxn], ophead[maxn];
int tot, optot, len[maxn], oplen[maxn];

void init()
{
tot
= 0 ;
optot
= 0 ;
memset(head,
- 1 , sizeof (head));
memset(ophead,
- 1 , sizeof (ophead));
scanf(
" %d%d%d " , & n, & m, & t);
t
-- ;
for ( int i = 0 ; i < m; i ++ )
{
int a, b, c;
scanf(
" %d%d%d " , & a, & b, & c);
a
-- ;
b
-- ;
edge[tot].next
= head[a];
head[a]
= tot;
edge[tot].v
= b;
edge[tot].w
= c;
tot
++ ;
opedge[optot].next
= ophead[b];
ophead[b]
= optot;
opedge[optot].v
= a;
opedge[optot].w
= c;
optot
++ ;
}
}

void dijkstra( int head[], Edge edge[], int len[])
{
bool visited[maxn];

memset(visited,
0 , sizeof (visited));
len[t]
= 0 ;
while ( 1 )
{
int best = inf, besti = - 1 ;
for ( int i = 0 ; i < n; i ++ )
{
if (len[i] < best && ! visited[i])
{
best
= len[i];
besti
= i;
}
}
if (besti == - 1 )
break ;
visited[besti]
= true ;
for ( int i = head[besti]; i != - 1 ; i = edge[i].next)
{
int v = edge[i].v;
int w = edge[i].w;
if (len[v] > len[besti] + w)
len[v]
= len[besti] + w;
}
}
}

int main()
{
// freopen("D:\\t.txt", "r", stdin);
init();
for ( int i = 0 ; i < n; i ++ )
{
len[i]
= oplen[i] = inf;
}
dijkstra(head, edge, len);
dijkstra(ophead, opedge, oplen);
int best = 0 ;
for ( int i = 0 ; i < n; i ++ )
if (best < len[i] + oplen[i])
best
= len[i] + oplen[i];
printf(
" %d\n " , best);
return 0 ;
}

你可能感兴趣的:(poj)