每日打卡(2/2)
传送门:点击打开链接
题目大意:
有些路,需要一些时间去走(双向),还有一些虫洞,可以回到过去(单向),求可不可以经过若干操作,回到过去的原点。
思路:
这次用Floyd做,刚开始数组开大了,居然TLE了???
这次做时经过思考,并不用将map[i][i] 值设为0,这是没有意义,全部初始化为0x3f3f3f即可。
在每次的循环中,我们如果发现存在map[i][i]<0,即证明存在负环,证明存在。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn = 550;
int f,n,m,w;
int map[maxn][maxn],d[maxn];
void init()
{
memset(map,0x3f3f3f,sizeof(map));
}
bool floyd()
{
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
// cout<<i<<" "<<j<<" "<<k<<" "<<map[i][k]<<" "<<map[k][j]<<endl;
if(map[i][j]>map[i][k]+map[k][j])
map[i][j] = map[i][k]+map[k][j];
}
// cout<<i<<" "<<map[i][i]<<endl;
if(map[i][i]<0) return 1;
}
return 0;
}
int main()
{
scanf("%d",&f);
while(f--)
{
scanf("%d%d%d",&n,&m,&w);
init();
for(int i=0;i<m;i++)
{
int s,e,t;
scanf("%d%d%d",&s,&e,&t);
if(t<map[s][e])
map[s][e] = map[e][s] = t;
}
for(int i=0;i<w;i++)
{
int s,e,t;
scanf("%d%d%d",&s,&e,&t);
map[s][e] = -t;
}
if(floyd()) printf("YES\n");
else printf("NO\n");
}
return 0;
}