我样例不过,但交上去,AC?
上一个题也遇到了这种情况,但经考证,确认是long double的玄学特性所致;但这一次怎么解释?
代码:
#include<iostream>
#include<cstring>
#include<queue>
#define re register
using namespace std;
const int N = 1e5;
int cnt,n,m;
bool flag;
bool vis[N];
int head[N],dis[N],cnte[N];
struct edge{
int v,w,next;
}e[N];
inline void add(int u,int v,int w){
cnt ++;
e[cnt].v = v;
e[cnt].w = w;
e[cnt].next = head[u];
head[u] = cnt;
}
inline void SPFA(){
queue<int> q;
vis[0] = true;
dis[0] = 0;
cnte[0] ++;
q.push(0);
while(! q.empty()){
int u = q.front();
vis[u] = false;
q.pop();
for(re int i = head[u];i != -1;i = e[i].next){
int v = e[i].v;
if(dis[v] < dis[u] + e[i].w){
dis[v] = dis[u] + e[i].w;
if(! vis[v]){
vis[v] = true;
cnte[v] ++;
q.push(v);
if(cnte[v] > n + 1){
flag = true;
return ;
}
}
}
}
}
flag = false;
}
inline void cs(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
memset(head,-1,sizeof(head));
memset(dis,-0x3f,sizeof(dis));
}
int main(){
cs();
cin>>n>>m;
for(re int i = 1;i <= m;i ++){
int x,y,z;
cin>>x>>y>>z;
add(x,y,-z);
}
for(re int i = 1;i <= n;i ++){
add(0,i,0);
}
SPFA();
if(flag){
cout<<"NO\n";
}else{
for(re int i = 1;i <= n;i ++){
cout<<dis[i]<<" ";
}
cout<<"\n";
}
return 0;
}