csu 1978: LXX的图论题

1978: LXX的图论题

        Time Limit: 1 Sec     Memory Limit: 128 Mb     Submitted: 71     Solved: 27    


Description

由于lxx的图论和数据结构太弱了,大佬Z决定为lxx补一补。于是大佬Z为lxx出了一道题目,题目如下:给出一张有向图,图中有n个点,m条边,每条边上都有一个权值w,问图中是否存在满足以下条件的点i,j,...p使得不等式w[i][j] * w[j][k] * .... * w[p][i]<1成立。奈何lxx太弱了,他决定寻求你的帮助。

Input

多组输入,以文件结尾。第一行两个整数n( 1<=n<=500 ),m( 1<=m<=n*(n-1)/2 ),接下来m行,每行3个数x,y,z,(x≠y):表示x到y有一条边,权值为z(0<z<20,且保证z小数点后面最多只有一位)。

Output

如果存在满足题目所描述的式子,输出“YES”,否则输出“NO”。

Sample Input

2 2
1 2 0.9
2 1 1.2
6 4
1 2 0.1
2 4 0.8
4 1 12
4 1 15

Sample Output

NO
YES

Hint

点的编号为1~n

Source

2017年8月月赛

Author

廖璇璇

题解:

直接floyd一次

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 #include <cstring>
 5 #include <algorithm>
 6 #define INF 0x4f4f4f
 7 using namespace std;
 8 double mp[510][510];
 9 double dist[510][510];
10 int n,m;
11 double floyd()
12 {
13     int i,j,k;
14     double minn=999999.0;
15     for(k=1; k<=n; k++)
16     {
17         for(i=1; i<=n; i++)
18             for(j=1; j<=n; j++)
19             {
20                 if(dist[i][j]>dist[i][k]*dist[k][j])
21                 {
22                     dist[i][j]=dist[i][k]*dist[k][j];
23                 }
24             }
25     }
26     for(i=1; i<=n; i++)
27        minn=min(minn,dist[i][i]);
28     return minn;
29 }
30 int main()
31 {
32     int s,t;
33     double v;
34     while(~scanf("%d%d",&n,&m))
35     {
36         memset(mp,0,sizeof(mp));
37         for(int i=1; i<=n; i++)
38             for(int j=1; j<=n; j++)
39                 dist[i][j]=INF;
40         for(int i=0; i<m; i++)
41         {
42             scanf("%d %d %lf",&s,&t,&v);
43             mp[s][t]=min(mp[s][t],v);
44             dist[s][t]=min(dist[s][t],v);
45         }
46         //  printf("%lf
",dist[1][4]);
47         if(floyd()<1)
48             printf("YES
");
49         else printf("NO
");
50     }
51     return 0;
52 }
原文地址:https://www.cnblogs.com/52why/p/7460184.html