TopCoder SRM 462 Div I 1000

比赛的时候没有A掉。。后来看了ikki大牛的提示算是明白了。。
由于n<=50想怎么写都行。。只要别暴力搜就可以了囧。。
首先枚举每条边。算出删掉这条边后从这条边的起点到2的最短路。。
为了方便可以把所有边的都反过来。。这样就都变成2到这个起点的最短路了。。
然后用spfa来更新答案。。就是说定义dist[i]从i节点运用最优策略到2的路程。。
那么关于j节点新的代价就是
删:deletecost of edge(j,i) /has been calculated before
不善:dist[i]+cost of edge(j,i)
那么新的代价就是这两个最大值。。
然后用这个来更新j节点。。跟平常的spfa一样就可以了。。
最后dist[0]就是所求了。。
Code:

#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <queue>
#define rep(i,n) for(int i=0;i<n;i++)
using namespace std;

class WarTransportation {
public:
int messenger(int, vector <string>);
};
const int maxn=100,inf=1<<29;int n;
struct edge
{
int s,t,c,dcost;bool e;
edge(int _s,int _t,int _c):s(_s),t(_t),c(_c),e(true){}
};
vector<edge> E[maxn];
typedef vector<edge>::iterator it;
void add_edge(vector<edge> E[maxn],int s,int t,int c)
{E[s].push_back(edge(s,t,c));}
void spfa(vector<edge> E[maxn],it d)
{
d->e=false;int dist[maxn];rep(i,n) dist[i]=inf;
bool inq[maxn]={0};inq[1]=true;dist[1]=0;
queue<int> Q;Q.push(1);
while(Q.size())
{
int t=Q.front();Q.pop();inq[t]=false;int cost=dist[t];
for(it i=E[t].begin();i!=E[t].end();i++)if(i->e)
{
int ncost=cost+i->c;
if(ncost<dist[i->t])
{
dist[i->t]=ncost;
if(!inq[i->t]) Q.push(i->t),inq[i->t]=true;
}
}
}
d->dcost=dist[d->t];d->e=true;
}
int WarTransportation::messenger(int _n, vector <string> h) {
n=_n;
string A;for(int i=0;i<h.size();i++) A+=h[i];
istringstream in(A);int s,t,c;char tmp;
do
{
in>>s>>t>>c;s–;t–;
add_edge(E,t,s,c);
}while(in>>tmp);
rep(i,n)
{
for(it e=E[i].begin();e!=E[i].end();e++)
spfa(E,e),cout<<e->t+1<<"->"<<e->s+1<<":"<<e->dcost<<endl;
}
int dist[maxn];rep(i,n) dist[i]=inf;
bool inq[maxn]={0};inq[1]=true;dist[1]=0;
queue<int> Q;Q.push(1);
while(Q.size())
{
int t=Q.front();Q.pop();inq[t]=false;int cost=dist[t];
for(it i=E[t].begin();i!=E[t].end();i++)
{
int ncost=max(cost+i->c,i->dcost);
if(ncost<dist[i->t])
{
dist[i->t]=ncost;
if(!inq[i->t]) Q.push(i->t),inq[i->t]=true;
}
}
}
if(dist[0]==inf) return -1;
return dist[0];
}

//Powered by [KawigiEdit] 2.0!
本高亮代码使用codeHl生成,

2 thoughts on “TopCoder SRM 462 Div I 1000

Leave a Reply to WJBZBMR Cancel reply

Your email address will not be published. Required fields are marked *