记录编号 |
138212 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
月考统计 |
最终得分 |
100 |
用户昵称 |
ggwdwsbs |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.604 s |
提交时间 |
2014-11-05 19:21:53 |
内存使用 |
0.36 MiB |
显示代码纯文本
//首先把不等式反过来,加入(24-29行);然后把每个节点接到0上;最后一遍spfa求最长路;
#include<stdio.h>
#include<cstring>
#include<queue>
#include<vector>
using namespace std;
vector<int>a[1001];
vector<int>b[1001];
queue<int>q;
int d[1001];
int n,m;
int l,r1,data;
int r[10001];
bool p[1001];
int t[1001];
bool p1=0;
int main()
{
freopen("ExamStat.in","r",stdin);
freopen("ExamStat.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=0;i<=n;i++)
a[i].push_back(0),b[i].push_back(0);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&l,&r1,&data);
a[l][0]++;
a[l].push_back(r1);
b[l].push_back(-data);
}
memset(d,-127/3,sizeof(d));
a[0][0]=n;
for(int i=1;i<=n;i++)
{
a[0].push_back(i);
b[0].push_back(0);
//for(int j=1;j<=a[i][0];j++)
//printf("%d ",a[i][0]);
//printf("\n");
}
//for(int i=1;i<=n;i++)
//if(r[l]==0)
//{
q.push(0);
p[0]=1;
t[0]++;
d[0]=0;
while(q.size()>0)
{
int u=q.front();
//printf("%d\n",u);
p[u]=0;
q.pop();
if(t[u]>n-1)//判环;
{
p1=1;
break;
}
for(int j=1;j<=a[u][0];j++)
if(d[a[u][j]]<d[u]+b[u][j])
{
d[a[u][j]]=d[u]+b[u][j];
//printf("%d %d %d %d %d %d\n",u,d[a[u][j]],d[u],b[u][j],a[u][j]);
if(!p[a[u][j]])
{
q.push(a[u][j]);
p[a[u][j]]=1;
t[a[u][j]]++;
}
}
//printf("%d %d\n",u,d[u]);
}
if(p1)
{
printf("SOMEONE LAY!");
//while(1);
return 0;
}
//}
for(int i=1;i<=n;i++)
{
printf("%d ",d[i]);
}
//while(1);
}