#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
const int N = 10100;
typedef long long _int;
struct edge{
int v,w,f;
};
//f -1 pirated 0 cracked 1 licensed
//dis[][0] the road is pirated
//dis[][1] the road is licensed
vector<edge> g[N];
queue<int> q;
bool inq[N];
const _int inf = ((_int)1<<50);
_int dis[N][2];
int n;
void update(_int &a,_int &b,_int &c,int v){
a=b+c;
if(!inq[v]){
inq[v]=true;
q.push(v);
}
}
void work(){
for(int i=2;i<=n;i++)
dis[i][1]=dis[i][0]=inf;
dis[1][1]=0;
dis[1][0]=inf;
memset(inq,0,sizeof(inq));
q.push(1);
while(!q.empty()){
int x=q.front();
q.pop();
inq[x]=false;
int sz=g[x].size();
for(int i=0;i<sz;i++){
int v=g[x][i].v;
_int w=g[x][i].w;
int f=g[x][i].f;
if(f==-1){
if(dis[v][0]>dis[x][0]+w)
update(dis[v][0],dis[x][0],w,v);
if(dis[v][0]>dis[x][1]+w)
update(dis[v][0],dis[x][1],w,v);
}
else if(f==0){
if(dis[v][0]>dis[x][0]+w)
update(dis[v][0],dis[x][0],w,v);
if(dis[v][1]>dis[x][1]+w)
update(dis[v][1],dis[x][1],w,v);
}
else if(f==1)
if(dis[v][1]>dis[x][1]+w)
update(dis[v][1],dis[x][1],w,v);
}
}
}
int main(){
int m;
while(~scanf("%d%d",&n,&m)){
int u,v;
_int w;
char str[20];
for(int i=1;i<=n;i++)
g[i].clear();
for(int i=0;i<m;i++){
scanf("%d%d%I64d%s",&u,&v,&w,str);
edge t;
t.v=v,t.w=w;
if(str[0]=='L')
t.f=1;
else if(str[0]=='P')
t.f=-1;
else if(str[0]=='C')
t.f=0;
g[u].push_back(t);
}
work();
_int ans=min(dis[n][0],dis[n][1]);
if(ans==inf){
printf("Offline\n");
continue;
}
else
printf("Online\n%I64d\n",ans);
}
return 0;
}
URAL - 1741 Communication Fiend
最新推荐文章于 2018-05-29 16:13:14 发布