Problem G
Time Limit : 6000/2000ms (Java/Other) Memory Limit : 65535/16384K (Java/Other)
Total Submission(s) : 56 Accepted Submission(s) : 19
Font: Times New Roman | Verdana | Georgia
Problem Description
“…黑黑的天空低垂/亮亮的繁星相随/虫儿飞虫儿飞/你在思念谁…”
I don’t know whether you could recall this soft song in your memory, but every time I listened to it, I thought about you. Shall it be several years since last time we met each other? I had given up every chance that I could tell you what I wanted you know. I think I was absolutely ridiculous.
We had lost contact with each other since that summer, I cannot remember how many times I wanted to make you a call and at last turned down the idea, I was such a coward that I even didn’t know how to start a conversation. I did not even know where you were! How can I be such a timid person?
Give thanks to god. Few days ago I finally heard about your recentness from one of my old classmates, and contact with you again! Though we’re thousands of miles away, I can be no more satisfied to chat with you. However, I know I may never have the courage to tell you what I am thinking, I hope I won’t disturb you too much. If only I am a firefly, I could fly near where you are. Even when your entire world has turned black, I always will be the light in the dark night.
Now here’s the problem, how tough will it be for a little firefly to cross thousands of miles to reach the destination? What is the possibility to survive? To make the problem simple, let’s consider the world as an undirected graph. The cities are vertexes. Little firefly can only fly from one city to another. However, a firefly is too small and too weak; it could easily be hurt on the way between two cities. Now I have the number of cities, the possibility being attacked between each pair of cities, the start city and the destination city, I want to know what the maximum possibility for the little bug to survive is. You know, one attack is deadly enough.
I don’t know whether you could recall this soft song in your memory, but every time I listened to it, I thought about you. Shall it be several years since last time we met each other? I had given up every chance that I could tell you what I wanted you know. I think I was absolutely ridiculous.
We had lost contact with each other since that summer, I cannot remember how many times I wanted to make you a call and at last turned down the idea, I was such a coward that I even didn’t know how to start a conversation. I did not even know where you were! How can I be such a timid person?
Give thanks to god. Few days ago I finally heard about your recentness from one of my old classmates, and contact with you again! Though we’re thousands of miles away, I can be no more satisfied to chat with you. However, I know I may never have the courage to tell you what I am thinking, I hope I won’t disturb you too much. If only I am a firefly, I could fly near where you are. Even when your entire world has turned black, I always will be the light in the dark night.
Now here’s the problem, how tough will it be for a little firefly to cross thousands of miles to reach the destination? What is the possibility to survive? To make the problem simple, let’s consider the world as an undirected graph. The cities are vertexes. Little firefly can only fly from one city to another. However, a firefly is too small and too weak; it could easily be hurt on the way between two cities. Now I have the number of cities, the possibility being attacked between each pair of cities, the start city and the destination city, I want to know what the maximum possibility for the little bug to survive is. You know, one attack is deadly enough.
Input
The input file consists several test cases, each cases start with an integer N (2<=N<=300), which means the count of cities; the second line of the input is two integer S, D (1<=S, D<=N), S is the number of start city; D is the number of destination city. The cities are indexed from 1 to N. The next N lines, each line contains N non-negative real number that not larger than 1.The i-th input of the j+2-th line means the possibility being attacked on the way from City j to City i. End of file indicates the end of the input.
Output
For each test case, output one line with a real number which represents the maximum possibility. The answer should be rounded to forth digit after the decimal point.
Sample Input
2 1 2 0.0 0.01 0.01 0.0
Sample Output
0.9900 HINT Huge input, use scanf to read data.
我本想用Dijkstra的,但是看到又2000MS呢,数据规模又小于是就碰碰运气,用了Floyd,没想到过了!!汗了
#include<iostream>
using namespace std;
double map[301][301];
int n,s,e;
void solve()
{
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(map[i][j]<map[i][k]*map[k][j])
map[i][j]=map[i][k]*map[k][j];
}
printf("%.4lf/n",map[s][e]);
}
int main()
{
double t;
while(scanf("%d",&n)!=EOF)
{
scanf("%d %d",&s,&e);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
scanf("%lf",&t);
map[i][j]=1-t;
}
solve();
}
return 0;
}