| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
晕死,无解时输出了INF~~还好然后110ms A掉了,spfa做的~#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
const int INF = 1000000000;
const int N = 301;
typedef vector<int> VCT;
vector <VCT> g(N);
int n, m, s, t, dist[N], r[N], tb[N], tp[N], map[N][N];
char c[N];
bool visit[N];
int Min(int x, int y)
{
return x < y ? x : y;
}
char Getcolor(int x, int dis, int &rt)
{
int rest;
if(dis < r[x])
{
rt = r[x] - dis;
return c[x];
}
else if(dis == r[x])
{
if(c[x] == 'B')
{
rt = tp[x];
return 'P';
}
else
{
rt = tb[x];
return 'B';
}
}
rest = (dis-r[x]) % (tb[x]+tp[x]);
if(c[x] == 'B')
{
if(rest > tp[x])
{
rt = tb[x]+tp[x]-rest;
return 'B';
}
else
{
rt = tp[x] - rest;
return 'P';
}
}
else
{
if(rest > tb[x])
{
rt = tb[x]+tp[x]-rest;
return 'P';
}
else
{
rt = tb[x] - rest;
return 'B';
}
}
}
int Same(int u, int v, int dis)
{
char cu, cv;
int tu, tv;
cu = Getcolor(u, dis, tu);
cv = Getcolor(v, dis, tv);
if(cu == cv) return 0;
else
{
if(tu != tv) return Min(tu, tv);
else
{
if(cu == 'B')
{
if(tp[u] != tb[v]) return tu+Min(tp[u], tb[v]);
else if(tb[u] != tp[v]) return tu+tp[u]+Min(tb[u], tp[v]);
else return -1;
}
else
{
if(tb[u] != tp[v]) return tu+Min(tb[u], tp[v]);
else if(tp[u] != tb[v]) return tu+tb[u]+Min(tp[u], tb[v]);
else return -1;
}
}
}
}
void spfa()
{
int i, u, v, len, tmp;
queue<int> q;
while(!q.empty()) q.pop();
q.push(s);
memset(visit, false, sizeof(visit));
for(i = 1; i <= n; i++) dist[i] = INF;
dist[s] = 0;
while(!q.empty())
{
u = q.front();
visit[u] = false;
q.pop();
len = g[u].size();
for(i = 0; i < len; i++)
{
v = g[u][i];
tmp = Same(u, v, dist[u]);
if(tmp!=-1 && dist[v]>dist[u]+map[u][v]+tmp)
{
dist[v] = dist[u] + map[u][v]+tmp;
if(!visit[v])
{
visit[v] = true;
q.push(v);
}
}
}
}
if(dist[t] != INF) printf("%d\n", dist[t]);
else printf("0\n");
}
int main()
{
int i, x, y, z;
scanf("%d%d%d%d", &s, &t, &n, &m);
for(i = 1; i <= n; i++) g[i].clear();
for(i = 1; i <= n; i++)
scanf(" %c%d%d%d", &c[i], &r[i], &tb[i], &tp[i]);
for(i = 0; i < m; i++)
{
scanf("%d%d%d", &x, &y, &z);
g[x].push_back(y);
g[y].push_back(x);
map[x][y] = map[y][x] = z;
}
spfa();
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator