0
点赞
收藏
分享

微信扫一扫

King POJ - 1364

​​点击打开链接​​

首先需要保证图的连通性。。

比如0点(此代码中以0为起点)与其他点都不连通 而图中又有负环 这时就会判不到负环

这道题关心的是整个[0,n]区间 任何一个地方出现负环就说明不合要求

 

#include <stdio.h>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;

struct node
{
int v;
int w;
int next;
};

queue <int> que;
node edge[210];
int first[110],dis[110],book[110],cnt[110];
int n,m,num,ss,flag;

void addedge(int u,int v,int w)
{
edge[num].v=v;
edge[num].w=w;
edge[num].next=first[u];
first[u]=num++;
return;
}

void spfa()
{
int i,u,v,w;
while(!que.empty()) que.pop();
memset(dis,0x3f,sizeof(dis));
memset(book,0,sizeof(book));
memset(cnt,0,sizeof(cnt));
que.push(ss);
dis[ss]=0;
book[ss]=1;
cnt[ss]++;
flag=1;
while(!que.empty())
{
u=que.front();
que.pop();
book[u]=0;
for(i=first[u];i!=-1;i=edge[i].next)
{
v=edge[i].v,w=edge[i].w;
if(dis[v]>dis[u]+w)
{
dis[v]=dis[u]+w;
if(book[v]==0)
{
que.push(v);
book[v]=1;
cnt[v]++;
if(cnt[v]>n)
{
flag=0;
return;
}
}
}
}
}

return;
}

int main()
{
int i,l,r,k;
char op[3];
while(scanf("%d",&n)!=EOF)
{
if(n==0) break;
scanf("%d",&m);
memset(first,-1,sizeof(first));
num=0;
for(i=1;i<=m;i++)
{
scanf("%d%d%s%d",&l,&r,op,&k);
if(op[0]=='g')
{
addedge(l+r,l-1,-k-1);
}
else
{
addedge(l-1,l+r,k-1);
}
}
ss=n+1;
for(i=1;i<=n;i++)
{
addedge(ss,i,0);
}
spfa();
if(flag==1) printf("lamentable kingdom\n");
else printf("successful conspiracy\n");
}
return 0;
}

 

 

 


举报

相关推荐

0 条评论