-----------------------
UPD2:
需要注意的:
1.重边
2.标号从0开始还是从1开始
3.循环初始化
----------
UPD1: 是我傻了。。每次更新完length(最短距离)之后应在所有未标记的结点中寻找下一个标记点,而不是(像我之前)在当前标记点的相邻的点中找,不然,不到南墙不回头,碰到南墙就断头……
#include<iostream>
#include<vector>
#include<string>
#include<cstring>
using namespace std;
const int MAXN = 100010;
struct station {
int id;
int value;
};
vector<station> point[MAXN];
string sta[10010];
int length[MAXN];
bool vist[MAXN];
int m, n;
int distance1(string s1, string s2)
{
int cont = 0, let[26] = { 0 };
for (int i = 0; i < s1.length(); i++)
{
if (s1[i] < 'a')
s1[i] += 32;
let[s1[i] - 'a']++;
}
for (int i = 0; i < s2.length(); i++)
{
if (s2[i] < 'a')
s2[i] += 32;
if (let[s2[i] - 'a'])
{
cont++;
let[s2[i] - 'a'] = 0;
}
}
return cont;
}
void link(int p1, int p2, int dist)
{
station s;
s.id = p2;
s.value = dist;
point[p1].push_back(s);
}
int dijkstra(int start, int end)
{
memset(length, 0x7f, sizeof(length));
memset(vist, 0, sizeof(vist));
int now = start;
int temp;
length[now] = 0; //shao jia le zhe ge
for (int k = 0; k<m; k++)
//while(1)
{
int rnow;
int value = 0x7f;
for (int i = 0; i < point[now].size(); i++)
{
rnow = point[now][i].id;
if (vist[rnow])
continue;
if (length[now] + point[now][i].value < length[rnow])
length[rnow] = length[now] + point[now][i].value;
}
vist[now] = 1;
for(int i=1;i<=m;i++)
if (length[i] < value && !vist[i])
{
value = length[i];
temp = i;
//flag = 1;
}
now=temp;
/*if (flag)
{
//front = now;
now = temp;
}
else
{
int i = 0;
while (vist[i])
i++;
now = i;
// vist[front] = 0;
//now = front;
//cout << front<<" "<< now<<" " ;
}*/
if (now == end)
break;
}
return length[end];
}
int main()
{
while (cin >> m >> n)
{
for (int i = 1; i <= m; i++)
cin >> sta[i];
for (int i = 0; i < n; i++)
{
int p1, p2, dist;
cin >> p1 >> p2;
dist = distance1(sta[p1], sta[p2]);
link(p1, p2, dist);
link(p2, p1, dist);
}
int start, end;
cin >> start >> end;
cout << dijkstra(start, end) << endl;
for (int i = 1; i <= m; i++)
point[i].clear();
}
return 0;
}
-----------------------------------------------------------------------------------------------
http://codeforces.com/gym/101343/problem/C
dijkstra求最短路
无法处理“断头路”
如
错误1 T 遇到了死循环
//#include<iostream>
//#include<vector>
//#include<string>
//#include<cstring>
//using namespace std;
//const int MAXN = 100010;
//struct station {
// int id;
// int value;
//};
//vector<station> point[MAXN];
//string sta[10010];
//int length[MAXN];
//bool vist[MAXN];
//int m, n;
//
//int distance(string s1, string s2)
//{
// int cont = 0, let[26] = { 0 };
// for (int i = 0; i < s1.length(); i++)
// {
// if (s1[i] < 'a')
// s1[i] += 32;
// let[s1[i] - 'a']++;
// }
// for (int i = 0; i < s2.length(); i++)
// {
// if (s2[i] < 'a')
// s2[i] += 32;
// if (let[s2[i] - 'a'])
// {
// cont++;
// let[s2[i] - 'a'] = 0;
// }
// }
// return cont;
//}
//
//
//void link(int p1, int p2, int dist)
//{
// station s;
// s.id = p2;
// s.value = dist;
// point[p1].push_back(s);
//}
//
//int dijkstra(int start, int end)
//{
// memset(length, 0x7f, sizeof(length));
// memset(vist, 0, sizeof(vist));
// station temp;
// int now = start;
// length[now] = 0; //shao jia le zhe ge
// int round = 0;
// while (round++ <= m )
// {
// temp.value = 0x7f;
// for (int i = 0; i < point[now].size(); i++)
// {
// int rnow= point[now][i].id;
// if (vist[rnow])
// continue;
// if (length[now] + point[now][i].value < length[rnow])
// length[rnow] = length[now] + point[now][i].value;
// if (length[rnow] < temp.value)
// temp = point[now][i];
// }
// vist[now] = 1;
// now = temp.id;
// if (now == end)
// break;
// }
// return length[end];
//}
//int main()
//{
//
// while (cin >> m >> n)
// {
// for (int i = 1; i <= m; i++)
// cin >> sta[i];
// for (int i = 0; i < n; i++)
// {
// int p1, p2, dist;
// cin >> p1 >> p2;
// dist = distance(sta[p1], sta[p2]);
// link(p1, p2, dist);
// link(p2, p1, dist);
// }
//
// int start, end;
// cin >> start >> end;
// cout << dijkstra(start, end) << endl;
//
// for (int i = 1; i <= m; i++)
// point[i].clear();
// }
// return 0;
//
//}
固定循环次数 同一组数据WA
//#include<iostream>
//#include<vector>
//#include<string>
//#include<cstring>
//using namespace std;
//const int MAXN = 100010;
//struct station {
// int id;
// int value;
//};
//vector<station> point[MAXN];
//string sta[10010];
//int length[MAXN];
//bool vist[MAXN];
//int m, n;
//
//int distance(string s1, string s2)
//{
// int cont = 0, let[26] = { 0 };
// for (int i = 0; i < s1.length(); i++)
// {
// if (s1[i] < 'a')
// s1[i] += 32;
// let[s1[i] - 'a']++;
// }
// for (int i = 0; i < s2.length(); i++)
// {
// if (s2[i] < 'a')
// s2[i] += 32;
// if (let[s2[i] - 'a'])
// {
// cont++;
// let[s2[i] - 'a'] = 0;
// }
// }
// return cont;
//}
//
//
//void link(int p1, int p2, int dist)
//{
// station s;
// s.id = p2;
// s.value = dist;
// point[p1].push_back(s);
//}
//
//int dijkstra(int start, int end)
//{
// memset(length, 0x7f, sizeof(length));
// memset(vist, 0, sizeof(vist));
// int now = start;
// int temp;
// length[now] = 0; //shao jia le zhe ge
// for (int k = 0; k<m; k++)
// {
// int value = 0x7f;
// for (int i = 0; i < point[now].size(); i++)
// {
// int rnow = point[now][i].id;
// if (vist[rnow])
// continue;
// if (length[now] + point[now][i].value < length[rnow])
// length[rnow] = length[now] + point[now][i].value;
// if (length[rnow] < value)
// {
// value = length[rnow];
// temp = point[now][i].id;
// }
// }
// vist[now] = 1;
// now = temp;
// // if (now == end)
// // break;
// }
// return length[end];
//}
//int main()
//{
//
// while (cin >> m >> n)
// {
// for (int i = 1; i <= m; i++)
// cin >> sta[i];
// for (int i = 0; i < n; i++)
// {
// int p1, p2, dist;
// cin >> p1 >> p2;
// dist = distance(sta[p1], sta[p2]);
// link(p1, p2, dist);
// link(p2, p1, dist);
// }
//
// int start, end;
// cin >> start >> end;
// cout << dijkstra(start, end) << endl;
//
// for (int i = 1; i <= m; i++)
// point[i].clear();
// }
// return 0;
//
//}