地址:
点击打开链接
题目,本次,只记录代码。带超级源点以及判断正负环的spfa。
代码如下:
#include<bits/stdc++.h>
int n,m,d[102],tol,head[102],dat[102];
bool vis[102];
using namespace std;
struct node
{
int to,cost,next;
}edge[333];
void add(int a,int b,int c)
{
edge[tol].to=b;
edge[tol].cost=c;
edge[tol].next=head[a];
head[a]=tol++;
}
bool spfa()
{
memset(vis,0,sizeof(vis));
memset(dat,0,sizeof(dat));
for(int i=0;i<=n;i++)
d[i]=-1e9;
d[n+1]=0;
stack<int>P;//不知道为什么,我发现用stack总是比queue耗时少
while(!P.empty()) P.pop();
P.push(n+1);vis[n+1]=1;
while(!P.empty())
{
int v=P.top();P.pop();vis[v]=0;
for(int i=head[v];i!=-1;i=edge[i].next)
{
node e=edge[i];
if(d[e.to]<d[v]+e.cost)
{
d[e.to]=d[v]+e.cost;
dat[e.to]++;
if(dat[e.to]>n+1)return 0;
if(!vis[e.to])
{
vis[e.to]=1;
P.push(e.to);
}
}
}
}
return 1;
}
int main()
{
while(~scanf("%d",&n))
{
if(!n)break;
memset(head,-1,sizeof(head));
tol=0;
scanf("%d",&m);
int i,j;
for(i=1;i<=m;i++)
{
int x,y,z;char t[4];
scanf("%d%d%s%d",&x,&y,&t,&z);
if(t[0]=='g')
add(x-1,x+y,z+1);
else
add(x+y,x-1,1-z);
}
for(i=0;i<=n;i++)//超级源点
add(n+1,i,0);
if(spfa())printf("lamentable kingdom\n");
else printf("successful conspiracy\n");
}
return 0;
}