spfa判負權邊
阿新 • • 發佈:2018-03-24
CP name mar pty () pos AD sin love
spfa判負環
如果一個點在spfa中被入隊了大於n次
那麽,我們就能肯定,有負環出現。
因為一個點入隊時,他肯定被更新了一次。
所以........ 如果不存在負權環。這個點最多被更新節點數次
我們就可以利用這個性質判負環
虧我dijk寫了一上午
題目
語文模板題
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
int dis[11000];
struct L
{
int point;
int weight;
int nxt;
};
L line[100000];
int head[10000],tail;
bool exist[100000];
int inque[100000];
queue<int> q;
int n,m;
void add(int x,int y,int val)
{
line[++tail].point=y;
line[tail].weight=val;
line[tail].nxt=head[x];
head[x]=tail;
}
void spfa(int begin)
{
memset(dis,0x3f ,sizeof(dis));
memset(exist,0,sizeof(exist));
dis[begin]=0;
exist[begin]=true;
inque[begin]+=1;
q.push(begin);
int pass;
while(!q.empty())
{
pass=q.front();
q.pop();
exist[pass]=false;
if(inque[pass]>n)
{
printf("Forever love" );
exit(0);
}
for(int need=head[pass];need;need=line[need].nxt)
if(dis[pass]+line[need].weight<dis[line[need].point])
{
dis[line[need].point]=dis[pass]+line[need].weight;
if(!exist[line[need].point])
{
q.push(line[need].point);
inque[line[need].point]+=1;
exist[line[need].point]=true;
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);
int a,b,c;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
add(a,b,-1*c);
}
spfa(1);
int ha=dis[n];
spfa(n);
printf("%d",min(ha,dis[1]));
return 0;
}
spfa判負權邊