标签:
Description
Input
Output
Sample Input
input | output |
---|---|
3 4 1 3 10 Licensed 1 2 2 Pirated 2 3 3 Licensed 2 3 6 Cracked |
Online 8 |
3 1 1 2 10 Licensed |
Offline |
大意:系统要从1更新到n,下面m行是可以进行更新的情况,x表示起点,y表示终点,d表示更新所要用的字节数目,问所需要消耗的最少字节数是多少。
先要对x进行排序,字符串处理未必需要strcmp,直接用ch[0]就可以了。
正品用正品更新完是正品,用盗版更新完是盗版,用破解版更新还是正品
盗版用盗版更新是盗版,用正品更新还是盗版,用破解版依旧是盗版
开个二维dp 1表示正品,2表示盗版
状态转移方程 dp[a[i].y] = min(dp[a[i].y],dp[a[i].x]+a[i].s)
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; struct edge{ int x,y,s; char ch[10]; }a[50010]; long long dp[50010][2]; bool cmp(edge i,edge j){ if(i.x == j.x) return i.y < j.y; return i.x < j.x; } int main() { int n,m; while(~scanf("%d%d",&n,&m)){ for(int i = 1; i <= m ; i++) scanf("%d%d%d%s",&a[i].x,&a[i].y,&a[i].s,&a[i].ch); sort(a+1,a+m+1,cmp); memset(dp,-1,sizeof(dp)); dp[1][1] = 0; for(int i = 1;i <= m ;i++){ if(a[i].ch[0] == ‘L‘){ if(dp[a[i].x][1] != -1 &&(dp[a[i].y][1] == -1 || dp[a[i].y][1] > dp[a[i].x][1] + a[i].s)) dp[a[i].y][1] = dp[a[i].x][1] + a[i].s; } else if(a[i].ch[0] == ‘C‘){ if(dp[a[i].x][1] != -1 &&(dp[a[i].y][1] == -1 || dp[a[i].y][1] > dp[a[i].x][1] + a[i].s)) dp[a[i].y][1] = dp[a[i].x][1] +a[i].s; if(dp[a[i].x][0] != -1 &&(dp[a[i].y][0] == -1 || dp[a[i].y][0] > dp[a[i].x][0] + a[i].s)) dp[a[i].y][0] = dp[a[i].x][0] + a[i].s; } else if(a[i].ch[0] == ‘P‘){ if(dp[a[i].x][0] != -1 && (dp[a[i].y][0] == -1 || dp[a[i].y][0] > dp[a[i].x][0] + a[i].s)) dp[a[i].y][0] = dp[a[i].x][0] + a[i].s; if(dp[a[i].x][1] != -1 && (dp[a[i].y][0] == -1 || dp[a[i].y][0] > dp[a[i].x][1] + a[i].s)) dp[a[i].y][0] = dp[a[i].x][1] + a[i].s; } } if(dp[n][0] == -1 && dp[n][1] == -1) printf("Offline\n"); else { printf("Online\n"); if(dp[n][0] == -1) printf("%lld\n",dp[n][1]); else if(dp[n][1] == -1) printf("%lld\n",dp[n][0]); else printf("%lld\n",min(dp[n][1],dp[n][0])); } } return 0; }
URAL1741——DP——Communication Fiend
标签:
原文地址:http://www.cnblogs.com/zero-begin/p/4496967.html