您的位置:首页 > 其它

Test for Job spfa变形 注意精度

2013-08-05 11:58 330 查看
http://poj.org/problem?id=3249

题意:给出一个有向图图 每点有一个权值 全职有正有负 找从任意一点出发的总权值最大的路径 输出其最大值

用spfa 。。 初始把入度为0的点加入队列 因为数值很大 所以要用到longlong 型

注意 最后输出maxx 也要是longlong型 一开始没注意到这个 wa很久 搞得人都要抓狂了

#include<iostream>
#include<string.h>
#include<stdio.h>
#include<queue>
#define INF 1000000000
using namespace std;
struct E {int to;int next;}edge[2000002];
int w[100012],adj[100012],num,in0[100012],vis[100002];
queue<int > q;
long long d[100012];
void add(int a,int b)
{
edge[num].to =b;
edge[num].next =adj[a];
adj[a]=num++;
}

int main()
{
int i,j,n,m,a,b,t,v;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=1;i<=n;i++)
scanf("%d",&w[i]);
memset(adj,-1,sizeof(adj));
memset(in0,0,sizeof(in0));
for(i=1;i<=n;i++)
d[i]=-1*INF;
num=0;
while(m--)
{
scanf("%d%d",&a,&b);
add(b,a);
in0[a]=1;   //rudu  buwei 0
}
memset(vis,0,sizeof(vis));
long long  max1=-1*INF;
for(i=1;i<=n;i++)
if(in0[i]==0)
{
q.push (i);
d[i]=w[i];
vis[i]=1;
}
while(!q.empty ())
{
t=q.front ();q.pop ();vis[t]=0;
for(i=adj[t];i!=-1;i=edge[i].next )
{
v=edge[i].to ;
if(d[v]<d[t]+w[v])
{
d[v]=d[t]+w[v];
if(!vis[v])
{
q.push (v);
vis[v]=1;
}
}
}
}
long long maxx=-1*INF;
for(i=1;i<=n;i++)
{
//printf("i %d %d\n",i,d[i]);
if(adj[i]==-1&&maxx<d[i])
maxx=d[i];
}
printf("%lld\n",maxx);

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: