两年以来第一回写【dijkstra万岁!】
好就没写了错的一塌糊涂。。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<stdio.h>
#include<queue>
#define MAXN 100008
#define INF 0x3f3f3f3f
using namespace std;
struct node{
int u,v,c;
}e[MAXN];
int h[MAXN],cnt;
void addEdge(int u,int v,int c){
cnt++;
e[cnt].v=v;e[cnt].c=c;e[cnt].u=h[u];h[u]=cnt;
}
int dis[MAXN],n,m;
bool vis[MAXN];
queue<int>q;
bool SPFA(int s){
q.push(s);
dis[s]=0;
vis[s]=true;
while(!q.empty()){
int u=q.front();q.pop();
vis[u]=false;
for(int i=h[u];i;i=e[i].u){
int v=e[i].v;
if(dis[v]>dis[u]+e[i].c){
dis[v]=dis[u]+e[i].c;
if(!vis[v]){
vis[v]=true;
q.push(v);
}
}
}
}
return false;
}
void init(){
memset(h,0,sizeof(h));
memset(dis,0x3f3f3f3f,sizeof(dis));
memset(vis,false,sizeof(vis));
cnt=0;
}
int main()
{
int i,j,T;
scanf("%d",&T);
while(T--){
init();
cin>>n>>m;
for(int i=1;i<=m;i++){
int u,v,c;
cin>>u>>v>>c;
addEdge(u,v,c);
if(c>=0)addEdge(v,u,c);
}
if(SPFA(1)==true)cout<<"YES\n";
else cout<<"NO\n";
}
return 0;
}
看了半天也没找到为啥死循环。
话说这死掉的算法CSP还会考吗