这提要把我弄崩溃了!
我还是用bellman做的。逻辑上怎么看都没错,尼玛就是WA。
我一直怀疑担心的整型问题始终不愿相信。
一怒之下直接把所有int换成了__int64。这尼玛果断AC了。
这种做法实在是龌蹉。
我想那一定是溢出的原因了,确实,
__int64 t = dis[edges[j].s]+edges[j].w;
这一句如果用int,还真可能溢出。
所以price数组,和dis数组还是用__int64。
这道题应该给个明确的上界!
人世间最痛苦的事莫过于WA而不知其因。。。
#include <iostream>
#include <string.h>
#include <math.h>
#include <stdlib.h>
using namespace std;
#define inf 0x7fffffff
struct Edge{
int s;
int e;
int w;
};
int M,N;
Edge edges[10000];
int num_edges;
__int64 dis[101];
__int64 price[101];
int Rank[101];
void bellman(int r){
dis[1] = 0;
for(int i=2;i<=100;++i)
dis[i] = inf;
for(int i=1;i<N;++i){
for(int j=0;j<num_edges;++j){
if(Rank[edges[j].s]>r||Rank[edges[j].e]>r
|| r-Rank[edges[j].s]>M || r-Rank[edges[j].e]>M)
continue;
if(dis[edges[j].s]==dis[edges[j].e])
continue;
__int64 t = dis[edges[j].s]+edges[j].w;
if(dis[edges[j].e] > t)
dis[edges[j].e] = t;
}
}
}
void process(){
__int64 res = price[1];
for(int i = 1;i<=N;++i){
bellman(Rank[i]);
for(int j=2;j<=N;++j)
if(dis[j]<inf)
res = min(res,dis[j]+price[j]);
}
cout<<res<<endl;
}
int main(){
cin>>M>>N;
num_edges = 0;
for(int i=1;i<=N;++i){
int X;
cin>>price[i]>>Rank[i]>>X;
for(int j=0;j<X;++j){
edges[num_edges].s = i;
cin>>edges[num_edges].e>>edges[num_edges].w;
++num_edges;
}
}
process();
return 0;
}