模板题,一直想用SPFA来做,可是这题却遇到了麻烦。因为对于原来的题来说一直想弄懂那个超级原点是怎么做的。这次用SPFA弄了N久,还是没弄出来… 后来果断用了BellmanFord()裸A啊….
原来Bellman比SPFA还要好写,果断不用Dijstra了~
#include<iostream>
#include<queue>
#define MAXN 103
#define INF 0x7F7F7F7F
using namespace std;
/*
struct Node
{
int v,price;
Node *next;
}Edge[MAXN],*ptr[MAXN];
*/
struct Node
{
int u,v,price;
}Edge[MAXN];
int N,M;
int edgeNum;
void addEdge( int u,int v,int val )
{
Edge[edgeNum].u=u;
Edge[edgeNum].v=v;
Edge[edgeNum].price=val;
edgeNum++;
/*Node *p=&Edge[edgeNum++];
p->v=v;
p->price=val;
p->next=ptr[u];
ptr[u]=p;*/
}
/*
bool spfa()
{
bool used[MAXN];
int dist[MAXN];
int cnt[MAXN];
queue<int>myQueue;
memset( used,1,sizeof(used) );
memset( dist,0x7F,sizeof(dist) );
memset( cnt,0,sizeof(cnt) );
while( !myQueue.empty() )myQueue.pop();
for( int i=0;i<=N;i++ )
myQueue.push(i);
while( !myQueue.empty() )
{
int u=myQueue.front();myQueue.pop();
used[u]=false;
Node *p=ptr[u];
if( dist[u]==INF ) dist[u]=0;
while( p )
{
if( dist[p->v]>=dist[u]+p->price )
{
dist[p->v]=dist[u]+p->price;
if( !used[p->v] )
{
myQueue.push(p->v);
used[p->v]=true;
if( ++cnt[p->v]>N-1 )
return false;
}
}
p=p->next;
}
}
return true;
}*/
bool Bellman_Ford()
{
int dist[MAXN];
int i,j;
memset( dist,0,sizeof(dist) );
for( i=0;i<=N;i++ )
for( j=0;j<M;j++ )
if( dist[Edge[j].v]>dist[Edge[j].u]+Edge[j].price )
dist[Edge[j].v]=dist[Edge[j].u]+Edge[j].price;
for( j=0;j<M;j++ )
if( dist[Edge[j].v]>dist[Edge[j].u]+Edge[j].price )
return false;
return true;
}
int main()
{
while( scanf( "%d",&N )!=EOF )
{
edgeNum=0;
if( N==0 )
break;
scanf( "%d",&M );
int i,j,k;
char com[3];
int a,b,p;
//for( i=0;i<=N;i++ ) ptr[i]=NULL;
for( i=1;i<=M;i++ )
{
scanf( "%d %d %s %d",&a,&b,&com,&p );
if( com[0]=='g' )
addEdge( a+b,a-1,-p-1 );
else
addEdge( a-1,a+b,p-1 );
}/*
for( i=1;i<=M;i++ )
{
Node *p=&Edge[edgeNum++];
p->v=i;
p->price=0;
p->next=ptr[0];
ptr[0]=p;
}*/
//if( spfa() )
if( !Bellman_Ford() )
printf( "successful conspiracy\n" );
else
printf( "lamentable kingdom\n" );
}
return 0;
}