POJ 2240 ZOJ 1082 Arbitrage 最短路,c++ stl pass g++ tle 难度:0
生活随笔
收集整理的這篇文章主要介紹了
POJ 2240 ZOJ 1082 Arbitrage 最短路,c++ stl pass g++ tle 难度:0
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
http://poj.org/problem?id=2240
用log化乘法為加法找正圈
c++ 110ms,g++tle
#include <string> #include <map> #include <iostream> #include <cmath> #include <cstring> #include <queue> using namespace std; const int maxn = 50; bool vis[maxn]; double chg[maxn][maxn]; double dis[maxn]; int e[maxn][maxn],deg[maxn]; map<string,int> idmp; int n,m; const double inf = 0x3fffffff;queue<int> que; bool hasloop(int s){while(!que.empty())que.pop();que.push(s);vis[s] = true;int cnt = 0;while(!que.empty()){cnt ++;s = que.front();que.pop();vis[s] = false;for(int i = 0;i < deg[s];i++){int t = e[s][i];if(dis[t] < dis[s] + chg[s][t]){dis[t] = dis[s] + chg[s][t];que.push(t);vis[t] = true;}}if(cnt > n * n)return true;}return false; }int main(){int ti = 0;while(cin>>n && n && ++ti){idmp.clear();for(int i = 0;i < n;i++){dis[i] = -inf;for(int j = 0;j < n;j++)chg[i][j] = -inf;}memset(vis,false,sizeof vis);memset(deg,0,sizeof deg);for(int i = 0;i < n;i++){string tmp;cin>>tmp;idmp[tmp] = i;}cin>>m;for(int i = 0;i < m;i++){string sf,st;double change;cin>>sf>>change>>st;change = log(change);int f = idmp[sf];int t = idmp[st];chg[f][t] = change;e[f][deg[f]++] = t;}bool fl = false;for(int i = 0;i < n;i++){if(dis[i] == -inf){dis[i] = 1;if(hasloop(i)){fl = true;break;}}}cout << "Case " << ti << ": ";if(fl)cout << "Yes" <<endl;else cout << "No" << endl;}return 0; }
轉載于:https://www.cnblogs.com/xuesu/p/4754667.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的POJ 2240 ZOJ 1082 Arbitrage 最短路,c++ stl pass g++ tle 难度:0的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CSS3弹性伸缩布局(一)——box布局
- 下一篇: iOS基础-高级视图-UITableVi