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\n",dist[1][4]); 47 if(floyd()<1) 48 printf("YES\n"); 49 else printf("NO\n"); 50 } 51 return 0; 52 }
作者:红雨
出处:https://www.cnblogs.com/52why
微信公众号: 红雨python