最近在acm poj上做题,昨天晚上边聊天边写1125的代码,12点多终于AC。
1. 忘记检测disjoint,变量用完忘记复位,WA了三次——这就是三心二意的好处;
2. 多做几次线下测试,debugging也是彻底熟悉理解算法的过程,犯错才会记得久;
3. priority_queue, 为了方便的重载operator < , 自己写了pair类;
4. 程序不简洁,有些可以优化的内容:
a) 记录最大最小值的地方;
b) 改变PQ中dst[i]的地方,当时急了,就直接全部弹出再装进去;
c) 每次变量值复位有些啰嗦;
// 1125 #include <iostream> #include <queue> #include <fstream> using namespace std; struct mypair { int first; int second; mypair(int a=0, int b=0) : first(a), second(b){} friend bool operator < (const mypair& a, const mypair& b) { return a.second > b.second; } }; int n; int w[101][101]; int dst[101]; bool v[101]; typedef mypair iip; priority_queue<iip, vector<iip>, less<iip>> PQ; int dijsktra(int s, int n, int& maxd, int& maxi) { int i, k=0; // 初始化 for(i=1; i<=n; i++) { dst[i] = 999999; if( w[s][i] != 0 ) dst[i] = w[s][i]; PQ.push(iip(i, dst[i])); } dst[s] = 0; v[s] = true; // 迪克斯特拉算法 while( PQ.size() != 0 ) { k = PQ.top().first; PQ.pop(); if(v[k]) continue; v[k] = true; for(i=1; i<=n; i++) { if(w[k][i] != 0) { if(dst[i] > w[k][i]+dst[k]) { dst[i] = w[k][i]+dst[k]; while( !PQ.empty()) PQ.pop(); for(int l=1; l<=n; l++) { if(!v[l]) PQ.push(iip(l, dst[l])); } } } } } // 判断s到其他点是否全通 for(i=1; i<=n; i++) { if( (i!=s) && dst[i]==0 || (i!=s) && dst[i]==999999 ) return 0; } // 记录下从s开始的最长路径 for(i=1; i<=n; i++) { if( i!=s && maxd<dst[i] ) { maxd = dst[i]; maxi = s; } } return 1; } int main() { //模拟系统输入, 实际提交时注释 ifstream cin; cin.open("acm.txt"); int i, j, k, l, m; int maxi = 0; int maxd = -999999; int minmaxd = 999999; int minmaxi = 0; while(cin>>n) { if(n==0) break; memset(w, 0, sizeof(w)); memset(v, false, sizeof(v)); for(i=1; i<=n; i++) { dst[i] = 999999; } // 输入 for(i=1; i<=n; i++) { cin >> k; for(j=1; j<=k; j++) { cin >> l >> m; w[i][l] = m; } } // 计算 for(i=1; i<=n; i++) { memset(v, false, sizeof(v)); dijsktra(i, n, maxd, maxi); if( minmaxd>maxd && maxd != -999999) { minmaxd = maxd; minmaxi = maxi; } maxi = 0; maxd = -999999; } //输出 if( minmaxi==0 && minmaxd==999999 ) cout<<"disjoint"<<endl; else cout<< minmaxi << " " << minmaxd<<endl; minmaxd = 999999; minmaxi = 0; } cin.close(); return 0; }