您的位置:首页 > 其它

poj 1511 Invitation Cards spfa 基础题!!虽然我做的比较坎坷!!可以练手啊!!

2011-11-26 11:13 302 查看
这道题整的我真是纠结,inf定义为0x7FFFFFF就是wa,改成7个F就过了,尼玛啊!!if(w+d[t]<d[temp])难道这样一加不超范围了吗!!求解释
这道题spfa 正反两次就行了
#include<iostream>
using namespace std;
#include<queue>
#include<algorithm>
#include<memory.h>
#define N 1000005
#define inf 0x7FFFFFFF
struct node
{
int u;
int c;
int next;
}e
,o
;
int a
,b
,c
,p
;
long long d
;
bool vis
;
int te=0;
void add(int a,int b,int c)
{

e[te].u=a;
e[te].c=c;
e[te].next=p[b];
p[b]=te;
te++;
}
int spfa(int s)
{
d[s]=0;
vis[s]=true;
queue<int>q;
q.push(s);
while(!q.empty())
{
int t=q.front();
q.pop();
vis[t]=false;
for(int j=p[t];j!=-1;j=e[j].next)
{
int w=e[j].c;
int temp=e[j].u;
if(w+d[t]<d[temp])
{
d[temp]=w+d[t];
if(!vis[temp])
{
vis[temp]=true;
q.push(temp);
}
}
}

}
}
int main()
{
int n,q;
int sum;
while(cin>>n)
{
while(n--)
{
scanf("%d%d",&sum,&q);
for(int i=0;i<N;i++)
{
p[i]=-1;
}
memset(vis,0,sizeof(vis));
fill(d,d+N,inf);

te=0;
for(int i=1;i<=q;i++)
{
scanf("%d%d%d",&a[i],&b[i],&c[i]);
add(a[i],b[i],c[i]);

}
spfa(1);
long long sum1=0;
for(int i=1;i<=sum;i++)
sum1+=d[i];
memset(vis,0,sizeof(vis));
for(int i=0;i<N;i++)
d[i]=inf;
for(int i=0;i<N;i++)
{
p[i]=-1;
}
te=0;
for(int i=1;i<=q;i++)
{
add(b[i],a[i],c[i]);
}
spfa(1) ;
long long sum2=0;
for(int i=1;i<=sum;i++)
sum2+=d[i];
cout<<sum1+sum2<<endl;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: