poj 3268(spfa)

时间:2021-08-18 18:17:20

http://poj.org/problem?id=3268

对于这道题,我想说的就是日了狗了,什么鬼,定义的一个数值的前后顺序不同,一个就TLE,一个就A,还16MS。

感觉人生观都奔溃了,果然,题目做多了总会见到鬼的!!!!!!

心累,不想写这个题了。

 #include <stdio.h>
#include <string.h>
#include <queue>
#include <iostream>
#define inf 0x3f
#define Max1 1010
#define Max2 100010 using namespace std;
int m,n,x;
int mark[Max1];
int next[Max1];
int u[Max2]; //把13和14行交换一下,你得到了结果会完全不同。。
int v[Max2];
int w[Max2];
int a[Max2],b[Max2],c[Max2];
int dist[Max1];
int ans[Max1];
bool vis[Max1]; queue <int >s;
void init()
{
memset( vis,false,sizeof(vis));
while( !s.empty()) s.pop();
memset(dist,inf,sizeof( dist ));
dist[x]=;
for(int i=;i<=n;i++)
mark[i]=-;
} void spfa()
{
s.push( x );
vis[ x ] = true ;
while( !s.empty() )
{
int tmp = s.front();
s.pop();
vis[ tmp ] = false;
for(int i = mark[ tmp ] ; i != - ; i = next[ i ] )
{
if( dist[ tmp ] + w[ i ] < dist[ v[ i ] ])
{
dist[ v[ i ] ] = dist[ tmp ] + w[ i ];
if( !vis[ v[ i ] ] )
{
s.push( v[ i ] );
vis[ v[ i ] ] = true;
}
}
}
}
for( int i = ; i <= n ; i++ )
ans[ i ] += dist[ i ];
} int main()
{
// freopen("in.txt","r",stdin);
while(~scanf("%d%d%d",&n,&m,&x))
{
memset( ans , , sizeof( ans ) );
init();
for( int i = ; i <= m ; i++ )
{
scanf( "%d%d%d",&a[ i ],&b[ i ],&c[ i ] );
u[ i ] = a[ i ];
v[ i ] = b[ i ];
w[ i ] = c[ i ];
next[ i ] = mark [ u[ i ] ] ;
mark[ u[ i ] ] = i;
}
spfa();
init();
for( int i = ; i <= m ; i++ )
{
v[ i ] = a[ i ];
u[ i ] = b[ i ];
w[ i ] = c[ i ];
next[ i ] = mark[ u[ i ] ];
mark[ u[ i ] ] = i;
}
spfa();
int Max = ans[];
for( int i = ; i <= n ; i++ )
if( ans[ i ] > Max ) Max = ans[ i ];
printf("%d\n",Max);
}
return ;
}