UVA1416 Warfare And Logistics

UVA1416 Warfare And Logistics

 

链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=36232

 

【题意】

  给出一个无向图,定义C =∑(d[i][j])  ,其中d[][]表示两点间的最短距离,求出C并求出删除一条边后的最大C2。

 

【思路】

  最短路树。

  简单地想我们可以用floyd或SPFA求出两点间的最短距离,然后枚举删除m条边再次进行这项工作。

  其实这里我们不用重新全部计算,因为如果所删除的边不在scr的最短路树上,那么这棵树不会被破坏。因此我们可以提前在求C的时候记录每一个scr最短路树上的边以及这棵最短路树的总权值,依旧枚举删边,判断是否需要重新计算即可。

  理论上时间需要O(n^3),实践中应该能跑O(n^2)。

  需要注意的是有重边的时候应该用次短边代替。

 

【代码】

 

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<queue>
  4 #include<vector>
  5 #include<algorithm>
  6 #define FOR(a,b,c) for(int a=(b);a<=(c);a++)
  7 using namespace std;
  8 
  9 const int maxn = 100+10,maxm=1000+10;
 10 const int INF=1e9;
 11 struct Edge{
 12     int u,v,w,next;
 13 };
 14 
 15 int n,m,L;
 16 
 17 struct SPFA{
 18     int n;
 19     Edge e[2*maxm];
 20     int en,front[maxn];
 21     int inq[maxn],d[maxn];
 22     int p[maxn];
 23     queue<int> q;
 24     
 25     void init(int n){
 26         this->n=n;
 27         en=-1;
 28         memset(front,-1,sizeof(front));
 29     }
 30     void AddEdge(int u,int v,int w) {
 31          en++; e[en].u=u; e[en].v=v; e[en].w=w; e[en].next=front[u]; front[u]=en;
 32     }
 33     void solve(int s) {
 34         memset(inq,0,sizeof(inq));
 35         memset(p,0,sizeof(p));
 36         for(int i=1;i<=n;i++) d[i]=INF;
 37     
 38         d[s]=0; inq[s]=1; q.push(s);
 39         while(!q.empty()) {
 40             int u=q.front(); q.pop(); inq[u]=0;
 41             for(int i=front[u];i>=0;i=e[i].next) {
 42                 int v=e[i].v,w=e[i].w;
 43                 if(w>0 && d[v]>d[u]+w) {         //w<0表示此边已断 
 44                     d[v]=d[u]+w;
 45                     p[v]=i;
 46                     if(!inq[v]) {
 47                         inq[v]=1;
 48                         q.push(v);
 49                     }
 50                 }
 51             }
 52         }
 53     }
 54 }spfa;
 55 
 56 vector<int> gr[maxn][maxn];  //保存ij之间所有的边 
 57 int idx[maxn][maxn];         //边ij在SPFA中对应的编号 
 58 int used[maxn][maxn][maxn];  //used[scr][u][v]表示在scr为根的最短路树上边uv是否出现 
 59 int sum_single[maxn];        //scr的最短路树的d[]之和
 60 
 61 int CALC_C() {
 62     int ans=0;
 63     memset(used,0,sizeof(used));
 64     FOR(scr,1,n) 
 65     {
 66         spfa.solve(scr);
 67         sum_single[scr]=0;
 68         FOR(v,1,n)
 69         {
 70            if(v!=scr) {
 71                    int u=spfa.e[spfa.p[v]].u;
 72                    used[scr][u][v]=used[scr][v][u]=1;
 73            }
 74            sum_single[scr] += spfa.d[v]==INF? L : spfa.d[v];
 75         }
 76         ans += sum_single[scr];
 77     }
 78     return ans;
 79 }
 80 int CALC_C2(int a,int b) {
 81     int ans=0;
 82     FOR(scr,1,n)
 83     {
 84           if(!used[scr][a][b]) ans+=sum_single[scr];  
 85           //如果边ij没有出现在i的最短路树上则无须重新计算 
 86           else
 87           {
 88                 spfa.solve(scr);
 89                 FOR(v,1,n) ans += spfa.d[v]==INF?L: spfa.d[v];
 90           }
 91     }
 92     return ans;
 93 }
 94 
 95 int main() 
 96 {
 97     while(scanf("%d%d%d",&n,&m,&L)==3)  //==3 否则会TLE 
 98     {
 99         int u,v,w;
100         spfa.init(n);
101         FOR(i,1,n) FOR(j,1,n) gr[i][j].clear();
102         while(m--) {
103             scanf("%d%d%d",&u,&v,&w);
104             gr[u][v].push_back(w);
105             gr[v][u].push_back(w);
106         }
107         FOR(i,1,n) FOR(j,i+1,n) if(!gr[i][j].empty()){
108             sort(gr[i][j].begin(),gr[i][j].end());
109             spfa.AddEdge(i,j,gr[i][j][0]);
110             idx[i][j]=spfa.en;
111             spfa.AddEdge(j,i,gr[i][j][0]);
112             idx[j][i]=spfa.en;
113         }
114         int c=CALC_C(),c2=-1;
115         FOR(i,1,n) FOR(j,i+1,n) if(!gr[i][j].empty()){
116             int& e1=spfa.e[idx[i][j]].w;
117             int& e2=spfa.e[idx[j][i]].w;
118             if(gr[i][j].size()==1) e1=e2=-1;
119             else e1=e2=gr[i][j][1];          //用次短边代替 
120             c2=max(c2,CALC_C2(i,j));         //"删除" ij之间的边之后计算c2
121             e1=e2=gr[i][j][0];
122         }
123         printf("%d %d\n",c,c2);
124     }
125     return 0;
126 }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《电子战与雷达系统工程手册》第四版是一本非常重要的参考书籍,该手册覆盖了广泛的主题,包括雷达技术、电子战、信号处理、通信、导航和控制等。这本手册可以作为电子工程师、雷达系统工程师以及电子战专家的参考书,也可以作为大学物理、电子工程和电信工程等专业的教材。 该手册的第四版主要涵盖了最新的雷达和电子战技术,还加入了一些新的章节,例如网络中的雷达和电子战、集成电子战系统和科学研究等。此外,该手册还包括了大量的实际应用例子和案例研究,这些例子可以被用来指导读者如何应用理论知识来设计和实现雷达和电子战系统。 总的来说,《电子战与雷达系统工程手册》第四版是一本非常实用的参考书籍,可以帮助读者快速掌握最新的雷达和电子战技术,同时也可以帮助读者深入了解这些技术的理论与应用,这将对电子工程师、雷达系统工程师、电子战专家以及大学物理、电子工程和电信工程等专业的学生们有很大的帮助。 ### 回答2: “Electronic Warfare and Radar Systems Engineering Handbook. 4th edition” 是一本工程手册,主要介绍了电子战和雷达系统工程方面的知识和技术。这本手册包括了广泛的主题,涵盖了从设计和开发到部署和维护的全过程,以及包括信息战、辐射信号处理、信号处理技术、电子战系统和雷达系统的详细介绍等方面。 本手册为希望进一步了解和深入研究电子战和雷达系统的工程师、技师和学生提供了一个重要的资源。读者可以通过这本手册获得关于电子战和雷达系统工程基础知识的全面概述,还可以了解最新的技术进展和相关的应用场景。 本手册内容还包括了实际问题的解决方法,涉及了复杂的电子战和雷达系统的设计、分析和测试等方面。并且,本手册也提供了准确和清晰的表达和图表,以便读者能够更加轻松地理解所学的内容。 总的来说,“Electronic Warfare and Radar Systems Engineering Handbook. 4th edition” 是一本对于电子战和雷达系统工程方面很有价值的资源,将会对于工程师、技师和学生在相关领域内的学习与工作有很大的帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值