很蛋疼,用vector写了一遍只AC两个用例,其他WA,为啥呢?想不通啊。。。不应该啊
改成邻接表写,瞬间AC。。。
两者最多是个遍历顺序不同,存取效率不同,不至于WA啊,TLE还说的过去,有懂的指点一下啊
邻接表写:
#include <iostream>
#include <map>
#include <stack>
#include <vector>
#include <queue>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAXN=2e5+10;
const int INF=0x3f3f3f3f;
struct Edge{
int to;
int cost;
int next;
}E[MAXN<<1];
bool flag=0;
bool vis[MAXN];
int head[MAXN];
int dist[MAXN];
int tol;
bool SPFA(int u){
vis[u]=1;
for(int i=head[u];i;i=E[i].next){
int v=E[i].to;
if(dist[v]>dist[u]+E[i].cost){
dist[v]=dist[u]+E[i].cost;
if(vis[v] || flag){ flag=1;break;}
//if(flag) return false;提前剪枝 否则TLE
SPFA(v);
}
}
vis[u]=0;
return true;
}
void addedge(int u,int v,int w){
tol++;
E[tol].to=v;
E[tol].cost=w;
E[tol].next=head[u];
head[u]=tol;
}
int main(){
int F;int n,m;
cin>>F;
while(F--){
tol=0;
flag=0;
memset(head,0,sizeof(head));
memset(dist,0,sizeof(dist));
memset(vis,0,sizeof(vis));
cin>>n>>m;
for(int i=1;i<=m;i++){
int x,y,l;
cin>>x>>y>>l;
if(l>=0){
addedge(x,y,l);
addedge(y,x,l);
}
else{
addedge(x,y,l);
}
}
for(int i=1;i<=n;i++){ SPFA(i);if(flag)break;}
if(flag)printf("YE5\n");
else printf("N0\n");
}
return 0;
}
vector写:
#include <iostream>
#include <map>
#include <stack>
#include <vector>
#include <queue>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAXN=2e5+10;
const int INF=0x3f3f3f3f;
struct Edge{
int v;
int cost;
Edge(int _v=0,int _cost=0):v(_v),cost(_cost){};
};
vector<Edge> E[MAXN*2];
bool flag=0;
bool vis[MAXN];
int dist[MAXN];
bool SPFA(int u){
if(vis[u]){
flag=1;
return false;
}
vis[u]=1;
for(int i=E[u].size()-1;i>=0;i--){
int v=E[u][i].v;
if(dist[v]>dist[u]+E[u][i].cost){
dist[v]=dist[u]+E[u][i].cost;
if(flag) return false;
SPFA(v);
}
}
vis[u]=0;
return true;
};
void addedge(int u,int v,int w){
E[u].push_back(Edge(v,w));
};
int main(){
int F;int n,m;
cin>>F;
while(F--){
flag=0;
memset(dist,0,sizeof(dist));
memset(vis,0,sizeof(vis));
cin>>n>>m;
for(int i=1;i<=m;i++){
int x,y,l;
cin>>x>>y>>l;
if(l>=0){
addedge(x,y,l);
addedge(y,x,l);
}
else{
addedge(x,y,l);
}
}
for(int i=1;i<=n;i++){ SPFA(i);if(flag)break;}
if(flag)printf("YE5\n");
else printf("N0\n");
}
return 0;
}