对于这道题我是真无语了,最大值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[N],o[N];
int a[N],b[N],c[N],p[N];
long long d[N];
bool vis[N];
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;
}