POJ 1192 限制條件最短路

2021-06-17 23:42:51 字數 1678 閱讀 8017

通道在一定的時間開放,處理一下就是最短路了

strtok(char, " ")還是很好用的

strtok()用來將字串分割成乙個個片段。引數s指向欲分割的字串,引數delim則為分割字串中包含的所有字元。當strtok()在引數s的字串中發現引數delim中包涵的分割字元時,則會將該字元改為\0 字元。在第一次呼叫時,strtok()必需給予引數s字串,往後的呼叫則將引數s設定成null。每次呼叫成功則返回指向被分割出片段的指標。

for (i = 0, p = strtok(str, " "); p != null; ++i)

atof(將字串轉換成浮點型數)

atoi(將字串轉換成整型數)

atol(將字串轉換成長整型數)

strtod(將字串轉換成浮點數)

strtol(將字串轉換成長整型數)

strtoul(將字串轉換成無符號長整型數)

sfpa

#include #include #include #include #include #include #include #include #include #include using namespace std;

typedef long long ll;

const double pi = acos(-1.0);

template inline t max(t a, t b)

template inline t min(t a, t b)

const int n = 111;

const int m = 11111;

const ll mod = 1000000007ll;

const int dir[4][2] = ;

const int inf = 0x3f3f3f3f;

struct node

edge[1111];

int cnt, head[55];

int n, m, s, t;

char str[1111];

int dist[55];

bool inq[55];

void add()

edge[cnt].w = a[2];

edge[cnt].v = a[1];

edge[cnt].next = head[a[0]];

a[2] = 0;

for (j = 3, k = 0; j < i; j +=2, ++k)

if (i == j)

edge[cnt].ways = k;

head[a[0]] = cnt++;

edge[cnt] = edge[cnt - 1];

edge[cnt].v = a[0];

edge[cnt].next = head[a[1]];

head[a[1]] = cnt++;

}void solve()}}

}}

}if (dist[t] == inf) printf("*\n");

else printf("%d\n", dist[t]);

}int main()

if (s == t) printf("0");

else solve();

}return 0;

}

POJ 1192最優連通子集

最優連通子集 題目的描述太繁瑣了。其實意思簡單,就是給定若干個點,如果兩個點之間的曼哈頓距離小於1,就連邊。然後就構成一顆樹,然後每個點都 有乙個權值,然後選取若干個點,使得權值和最大,並且點與點之前都連通。簡單的樹形dp,dp i 表示以i點為根的子樹並且選取i點時的最大權值。方程就很好寫,dp ...

poj 1192(簡單樹形dp)

題意 這題描述看似很複雜,其實讀懂後就是乙個相鄰點之間連通問題,水題。解題思路 首先把相鄰的點連線起來建立一棵樹,dp i 0 表示不選擇i節點可以得到的最大價值,dp i 1 表示選擇i節點可以得到的最大價值。狀態方程很簡單,詳見 include include include includeus...

poj 1192 最優連通子集 (樹形dp)

設dp u 0 為以u為根的子樹,子集中沒有u的最大權值,dp u 1 則表示子集中有u。如果子集中沒有u,那麼u的所有兒子中只能選乙個。如果子集中有u,那麼u的所有兒子要麼不選,要麼必須在子集中。狀態轉移方程 dp u 0 max dp u 0 max dp v 0 dp v 1 dp u 1 m...