poj 3259 Wormholes
2013-04-23 09:22
183 查看
题意:John的农场里field块地,path条路连接两块地,hole个虫洞,虫洞是一条单向路,不但会把你传送到目的地,而且时间会倒退Ts。我们的任务是知道会不会在从某块地出发后又回来,看到了离开之前的自己。
思路:用bellman-ford 判断有没有负权回路,如果有他就能看到自己。
不过,我认为应该判断每个点有没有负权回路,而不仅仅只判断第一个点就行了(如果某位大牛路过看到,觉得理解不对 希望多多指教)
代码没优化
3259 Wormholes" TITLE="poj 3259 Wormholes" />
#include <stdio.h>
#define M 505
#define N 52051
#define inf 999999
struct Edge
{
int
v1,v2;
int w;
} edge
;
int num;
int bellman(int n)
{
int
i,j,k,dis[M];
k = 1;
// for (k = 1; k
<= n; k
++)
//这里本是要判断所有点的
// {
for (i = 1; i <= n; i ++)
dis[i] = inf;
dis[k] = 0;
for (i = 1; i < n; i ++)
{
for (j = 1; j <= num; j ++)
if (dis[edge[j].v2] >
dis[edge[j].v1]+edge[j].w)
dis[edge[j].v2] = dis[edge[j].v1]+edge[j].w;
}
for (j = 1; j <= num; j ++)
if (dis[edge[j].v2] >
dis[edge[j].v1]+edge[j].w)
return 0;
// }
return
1;
}
int main ()
{
int
t,n,m,v1,v2,w,time,k;
scanf
("%d",&t);
while (t
--)
{
scanf
("%d%d%d",&n,&m,&w);
k = 1;
while (m --)
{
scanf
("%d%d%d",&v1,&v2,&time);
edge[k].v1 = v1;
edge[k].v2 = v2;
edge[k].w = time;
k ++;
edge[k].v2 = v1;
edge[k].v1 = v2;
edge[k].w = time;
k ++;
}
while (w --)
{
scanf
("%d%d%d",&v1,&v2,&time);
edge[k].v1 = v1;
edge[k].v2 = v2;
edge[k].w = -1*time;
k ++;
}
num = k-1;
int ans = bellman(n);
if (ans==0)
printf ("YES\n");
else
printf ("NO\n");
}
return
0;
}
思路:用bellman-ford 判断有没有负权回路,如果有他就能看到自己。
不过,我认为应该判断每个点有没有负权回路,而不仅仅只判断第一个点就行了(如果某位大牛路过看到,觉得理解不对 希望多多指教)
代码没优化
3259 Wormholes" TITLE="poj 3259 Wormholes" />
#include <stdio.h>
#define M 505
#define N 52051
#define inf 999999
struct Edge
{
int
v1,v2;
int w;
} edge
;
int num;
int bellman(int n)
{
int
i,j,k,dis[M];
k = 1;
// for (k = 1; k
<= n; k
++)
//这里本是要判断所有点的
// {
for (i = 1; i <= n; i ++)
dis[i] = inf;
dis[k] = 0;
for (i = 1; i < n; i ++)
{
for (j = 1; j <= num; j ++)
if (dis[edge[j].v2] >
dis[edge[j].v1]+edge[j].w)
dis[edge[j].v2] = dis[edge[j].v1]+edge[j].w;
}
for (j = 1; j <= num; j ++)
if (dis[edge[j].v2] >
dis[edge[j].v1]+edge[j].w)
return 0;
// }
return
1;
}
int main ()
{
int
t,n,m,v1,v2,w,time,k;
scanf
("%d",&t);
while (t
--)
{
scanf
("%d%d%d",&n,&m,&w);
k = 1;
while (m --)
{
scanf
("%d%d%d",&v1,&v2,&time);
edge[k].v1 = v1;
edge[k].v2 = v2;
edge[k].w = time;
k ++;
edge[k].v2 = v1;
edge[k].v1 = v2;
edge[k].w = time;
k ++;
}
while (w --)
{
scanf
("%d%d%d",&v1,&v2,&time);
edge[k].v1 = v1;
edge[k].v2 = v2;
edge[k].w = -1*time;
k ++;
}
num = k-1;
int ans = bellman(n);
if (ans==0)
printf ("YES\n");
else
printf ("NO\n");
}
return
0;
}
相关文章推荐
- poj&nbsp;3259&nbsp;Wormholes(spfa)
- poj&nbsp;1001&nbsp;解题报告
- ACM: dfs题 poj 1321 (n皇后问题)
- ACM: dp题 poj 1276 go on 动态规…
- ACM: 最小费用最大流 图论题 poj 2…
- POJ 2039 To and Fro
- ACM: 数论题 toj3343 同 poj 1061
- ZZULI_SummerPractice(3) POJ 12…
- ACM: 博弈题 poj 1067
- POJ 1861 Network
- ACM:动态规划题 poj 1015
- POJ 3461 Oulipo
- ACM: 线段树 poj 2886 约瑟夫问题
- ACM: 动态规划题 poj 1925
- POJ 3295 Tautology(似乎是模拟?…
- ACM: 动态规划题 poj 3093 0-1背包
- poj1915--Knight Moves(初级BFS)
- poj&nbsp;1273
- poj&nbsp;1038&nbsp;动态规划(dp)
- poj&nbsp;2531&nbsp;暴力dfs